LLVM API Documentation
00001 //===-- SelectionDAG.cpp - Implement the SelectionDAG data structures -----===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This implements the SelectionDAG class. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #include "llvm/CodeGen/SelectionDAG.h" 00015 #include "SDNodeDbgValue.h" 00016 #include "llvm/ADT/SetVector.h" 00017 #include "llvm/ADT/SmallPtrSet.h" 00018 #include "llvm/ADT/SmallSet.h" 00019 #include "llvm/ADT/SmallVector.h" 00020 #include "llvm/ADT/StringExtras.h" 00021 #include "llvm/Analysis/ValueTracking.h" 00022 #include "llvm/CodeGen/MachineBasicBlock.h" 00023 #include "llvm/CodeGen/MachineConstantPool.h" 00024 #include "llvm/CodeGen/MachineFrameInfo.h" 00025 #include "llvm/CodeGen/MachineModuleInfo.h" 00026 #include "llvm/IR/CallingConv.h" 00027 #include "llvm/IR/Constants.h" 00028 #include "llvm/IR/DataLayout.h" 00029 #include "llvm/IR/DebugInfo.h" 00030 #include "llvm/IR/DerivedTypes.h" 00031 #include "llvm/IR/Function.h" 00032 #include "llvm/IR/GlobalAlias.h" 00033 #include "llvm/IR/GlobalVariable.h" 00034 #include "llvm/IR/Intrinsics.h" 00035 #include "llvm/Support/CommandLine.h" 00036 #include "llvm/Support/Debug.h" 00037 #include "llvm/Support/ErrorHandling.h" 00038 #include "llvm/Support/ManagedStatic.h" 00039 #include "llvm/Support/MathExtras.h" 00040 #include "llvm/Support/Mutex.h" 00041 #include "llvm/Support/raw_ostream.h" 00042 #include "llvm/Target/TargetInstrInfo.h" 00043 #include "llvm/Target/TargetIntrinsicInfo.h" 00044 #include "llvm/Target/TargetLowering.h" 00045 #include "llvm/Target/TargetMachine.h" 00046 #include "llvm/Target/TargetOptions.h" 00047 #include "llvm/Target/TargetRegisterInfo.h" 00048 #include "llvm/Target/TargetSelectionDAGInfo.h" 00049 #include "llvm/Target/TargetSubtargetInfo.h" 00050 #include <algorithm> 00051 #include <cmath> 00052 00053 using namespace llvm; 00054 00055 /// makeVTList - Return an instance of the SDVTList struct initialized with the 00056 /// specified members. 00057 static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) { 00058 SDVTList Res = {VTs, NumVTs}; 00059 return Res; 00060 } 00061 00062 // Default null implementations of the callbacks. 00063 void SelectionDAG::DAGUpdateListener::NodeDeleted(SDNode*, SDNode*) {} 00064 void SelectionDAG::DAGUpdateListener::NodeUpdated(SDNode*) {} 00065 00066 //===----------------------------------------------------------------------===// 00067 // ConstantFPSDNode Class 00068 //===----------------------------------------------------------------------===// 00069 00070 /// isExactlyValue - We don't rely on operator== working on double values, as 00071 /// it returns true for things that are clearly not equal, like -0.0 and 0.0. 00072 /// As such, this method can be used to do an exact bit-for-bit comparison of 00073 /// two floating point values. 00074 bool ConstantFPSDNode::isExactlyValue(const APFloat& V) const { 00075 return getValueAPF().bitwiseIsEqual(V); 00076 } 00077 00078 bool ConstantFPSDNode::isValueValidForType(EVT VT, 00079 const APFloat& Val) { 00080 assert(VT.isFloatingPoint() && "Can only convert between FP types"); 00081 00082 // convert modifies in place, so make a copy. 00083 APFloat Val2 = APFloat(Val); 00084 bool losesInfo; 00085 (void) Val2.convert(SelectionDAG::EVTToAPFloatSemantics(VT), 00086 APFloat::rmNearestTiesToEven, 00087 &losesInfo); 00088 return !losesInfo; 00089 } 00090 00091 //===----------------------------------------------------------------------===// 00092 // ISD Namespace 00093 //===----------------------------------------------------------------------===// 00094 00095 /// isBuildVectorAllOnes - Return true if the specified node is a 00096 /// BUILD_VECTOR where all of the elements are ~0 or undef. 00097 bool ISD::isBuildVectorAllOnes(const SDNode *N) { 00098 // Look through a bit convert. 00099 if (N->getOpcode() == ISD::BITCAST) 00100 N = N->getOperand(0).getNode(); 00101 00102 if (N->getOpcode() != ISD::BUILD_VECTOR) return false; 00103 00104 unsigned i = 0, e = N->getNumOperands(); 00105 00106 // Skip over all of the undef values. 00107 while (i != e && N->getOperand(i).getOpcode() == ISD::UNDEF) 00108 ++i; 00109 00110 // Do not accept an all-undef vector. 00111 if (i == e) return false; 00112 00113 // Do not accept build_vectors that aren't all constants or which have non-~0 00114 // elements. We have to be a bit careful here, as the type of the constant 00115 // may not be the same as the type of the vector elements due to type 00116 // legalization (the elements are promoted to a legal type for the target and 00117 // a vector of a type may be legal when the base element type is not). 00118 // We only want to check enough bits to cover the vector elements, because 00119 // we care if the resultant vector is all ones, not whether the individual 00120 // constants are. 00121 SDValue NotZero = N->getOperand(i); 00122 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits(); 00123 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(NotZero)) { 00124 if (CN->getAPIntValue().countTrailingOnes() < EltSize) 00125 return false; 00126 } else if (ConstantFPSDNode *CFPN = dyn_cast<ConstantFPSDNode>(NotZero)) { 00127 if (CFPN->getValueAPF().bitcastToAPInt().countTrailingOnes() < EltSize) 00128 return false; 00129 } else 00130 return false; 00131 00132 // Okay, we have at least one ~0 value, check to see if the rest match or are 00133 // undefs. Even with the above element type twiddling, this should be OK, as 00134 // the same type legalization should have applied to all the elements. 00135 for (++i; i != e; ++i) 00136 if (N->getOperand(i) != NotZero && 00137 N->getOperand(i).getOpcode() != ISD::UNDEF) 00138 return false; 00139 return true; 00140 } 00141 00142 00143 /// isBuildVectorAllZeros - Return true if the specified node is a 00144 /// BUILD_VECTOR where all of the elements are 0 or undef. 00145 bool ISD::isBuildVectorAllZeros(const SDNode *N) { 00146 // Look through a bit convert. 00147 if (N->getOpcode() == ISD::BITCAST) 00148 N = N->getOperand(0).getNode(); 00149 00150 if (N->getOpcode() != ISD::BUILD_VECTOR) return false; 00151 00152 bool IsAllUndef = true; 00153 for (unsigned i = 0, e = N->getNumOperands(); i < e; ++i) { 00154 if (N->getOperand(i).getOpcode() == ISD::UNDEF) 00155 continue; 00156 IsAllUndef = false; 00157 // Do not accept build_vectors that aren't all constants or which have non-0 00158 // elements. We have to be a bit careful here, as the type of the constant 00159 // may not be the same as the type of the vector elements due to type 00160 // legalization (the elements are promoted to a legal type for the target 00161 // and a vector of a type may be legal when the base element type is not). 00162 // We only want to check enough bits to cover the vector elements, because 00163 // we care if the resultant vector is all zeros, not whether the individual 00164 // constants are. 00165 SDValue Zero = N->getOperand(i); 00166 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits(); 00167 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Zero)) { 00168 if (CN->getAPIntValue().countTrailingZeros() < EltSize) 00169 return false; 00170 } else if (ConstantFPSDNode *CFPN = dyn_cast<ConstantFPSDNode>(Zero)) { 00171 if (CFPN->getValueAPF().bitcastToAPInt().countTrailingZeros() < EltSize) 00172 return false; 00173 } else 00174 return false; 00175 } 00176 00177 // Do not accept an all-undef vector. 00178 if (IsAllUndef) 00179 return false; 00180 return true; 00181 } 00182 00183 /// \brief Return true if the specified node is a BUILD_VECTOR node of 00184 /// all ConstantSDNode or undef. 00185 bool ISD::isBuildVectorOfConstantSDNodes(const SDNode *N) { 00186 if (N->getOpcode() != ISD::BUILD_VECTOR) 00187 return false; 00188 00189 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { 00190 SDValue Op = N->getOperand(i); 00191 if (Op.getOpcode() == ISD::UNDEF) 00192 continue; 00193 if (!isa<ConstantSDNode>(Op)) 00194 return false; 00195 } 00196 return true; 00197 } 00198 00199 /// isScalarToVector - Return true if the specified node is a 00200 /// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low 00201 /// element is not an undef. 00202 bool ISD::isScalarToVector(const SDNode *N) { 00203 if (N->getOpcode() == ISD::SCALAR_TO_VECTOR) 00204 return true; 00205 00206 if (N->getOpcode() != ISD::BUILD_VECTOR) 00207 return false; 00208 if (N->getOperand(0).getOpcode() == ISD::UNDEF) 00209 return false; 00210 unsigned NumElems = N->getNumOperands(); 00211 if (NumElems == 1) 00212 return false; 00213 for (unsigned i = 1; i < NumElems; ++i) { 00214 SDValue V = N->getOperand(i); 00215 if (V.getOpcode() != ISD::UNDEF) 00216 return false; 00217 } 00218 return true; 00219 } 00220 00221 /// allOperandsUndef - Return true if the node has at least one operand 00222 /// and all operands of the specified node are ISD::UNDEF. 00223 bool ISD::allOperandsUndef(const SDNode *N) { 00224 // Return false if the node has no operands. 00225 // This is "logically inconsistent" with the definition of "all" but 00226 // is probably the desired behavior. 00227 if (N->getNumOperands() == 0) 00228 return false; 00229 00230 for (unsigned i = 0, e = N->getNumOperands(); i != e ; ++i) 00231 if (N->getOperand(i).getOpcode() != ISD::UNDEF) 00232 return false; 00233 00234 return true; 00235 } 00236 00237 ISD::NodeType ISD::getExtForLoadExtType(ISD::LoadExtType ExtType) { 00238 switch (ExtType) { 00239 case ISD::EXTLOAD: 00240 return ISD::ANY_EXTEND; 00241 case ISD::SEXTLOAD: 00242 return ISD::SIGN_EXTEND; 00243 case ISD::ZEXTLOAD: 00244 return ISD::ZERO_EXTEND; 00245 default: 00246 break; 00247 } 00248 00249 llvm_unreachable("Invalid LoadExtType"); 00250 } 00251 00252 /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X) 00253 /// when given the operation for (X op Y). 00254 ISD::CondCode ISD::getSetCCSwappedOperands(ISD::CondCode Operation) { 00255 // To perform this operation, we just need to swap the L and G bits of the 00256 // operation. 00257 unsigned OldL = (Operation >> 2) & 1; 00258 unsigned OldG = (Operation >> 1) & 1; 00259 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits 00260 (OldL << 1) | // New G bit 00261 (OldG << 2)); // New L bit. 00262 } 00263 00264 /// getSetCCInverse - Return the operation corresponding to !(X op Y), where 00265 /// 'op' is a valid SetCC operation. 00266 ISD::CondCode ISD::getSetCCInverse(ISD::CondCode Op, bool isInteger) { 00267 unsigned Operation = Op; 00268 if (isInteger) 00269 Operation ^= 7; // Flip L, G, E bits, but not U. 00270 else 00271 Operation ^= 15; // Flip all of the condition bits. 00272 00273 if (Operation > ISD::SETTRUE2) 00274 Operation &= ~8; // Don't let N and U bits get set. 00275 00276 return ISD::CondCode(Operation); 00277 } 00278 00279 00280 /// isSignedOp - For an integer comparison, return 1 if the comparison is a 00281 /// signed operation and 2 if the result is an unsigned comparison. Return zero 00282 /// if the operation does not depend on the sign of the input (setne and seteq). 00283 static int isSignedOp(ISD::CondCode Opcode) { 00284 switch (Opcode) { 00285 default: llvm_unreachable("Illegal integer setcc operation!"); 00286 case ISD::SETEQ: 00287 case ISD::SETNE: return 0; 00288 case ISD::SETLT: 00289 case ISD::SETLE: 00290 case ISD::SETGT: 00291 case ISD::SETGE: return 1; 00292 case ISD::SETULT: 00293 case ISD::SETULE: 00294 case ISD::SETUGT: 00295 case ISD::SETUGE: return 2; 00296 } 00297 } 00298 00299 /// getSetCCOrOperation - Return the result of a logical OR between different 00300 /// comparisons of identical values: ((X op1 Y) | (X op2 Y)). This function 00301 /// returns SETCC_INVALID if it is not possible to represent the resultant 00302 /// comparison. 00303 ISD::CondCode ISD::getSetCCOrOperation(ISD::CondCode Op1, ISD::CondCode Op2, 00304 bool isInteger) { 00305 if (isInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3) 00306 // Cannot fold a signed integer setcc with an unsigned integer setcc. 00307 return ISD::SETCC_INVALID; 00308 00309 unsigned Op = Op1 | Op2; // Combine all of the condition bits. 00310 00311 // If the N and U bits get set then the resultant comparison DOES suddenly 00312 // care about orderedness, and is true when ordered. 00313 if (Op > ISD::SETTRUE2) 00314 Op &= ~16; // Clear the U bit if the N bit is set. 00315 00316 // Canonicalize illegal integer setcc's. 00317 if (isInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT 00318 Op = ISD::SETNE; 00319 00320 return ISD::CondCode(Op); 00321 } 00322 00323 /// getSetCCAndOperation - Return the result of a logical AND between different 00324 /// comparisons of identical values: ((X op1 Y) & (X op2 Y)). This 00325 /// function returns zero if it is not possible to represent the resultant 00326 /// comparison. 00327 ISD::CondCode ISD::getSetCCAndOperation(ISD::CondCode Op1, ISD::CondCode Op2, 00328 bool isInteger) { 00329 if (isInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3) 00330 // Cannot fold a signed setcc with an unsigned setcc. 00331 return ISD::SETCC_INVALID; 00332 00333 // Combine all of the condition bits. 00334 ISD::CondCode Result = ISD::CondCode(Op1 & Op2); 00335 00336 // Canonicalize illegal integer setcc's. 00337 if (isInteger) { 00338 switch (Result) { 00339 default: break; 00340 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT 00341 case ISD::SETOEQ: // SETEQ & SETU[LG]E 00342 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE 00343 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE 00344 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE 00345 } 00346 } 00347 00348 return Result; 00349 } 00350 00351 //===----------------------------------------------------------------------===// 00352 // SDNode Profile Support 00353 //===----------------------------------------------------------------------===// 00354 00355 /// AddNodeIDOpcode - Add the node opcode to the NodeID data. 00356 /// 00357 static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) { 00358 ID.AddInteger(OpC); 00359 } 00360 00361 /// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them 00362 /// solely with their pointer. 00363 static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList) { 00364 ID.AddPointer(VTList.VTs); 00365 } 00366 00367 /// AddNodeIDOperands - Various routines for adding operands to the NodeID data. 00368 /// 00369 static void AddNodeIDOperands(FoldingSetNodeID &ID, 00370 ArrayRef<SDValue> Ops) { 00371 for (auto& Op : Ops) { 00372 ID.AddPointer(Op.getNode()); 00373 ID.AddInteger(Op.getResNo()); 00374 } 00375 } 00376 00377 /// AddNodeIDOperands - Various routines for adding operands to the NodeID data. 00378 /// 00379 static void AddNodeIDOperands(FoldingSetNodeID &ID, 00380 ArrayRef<SDUse> Ops) { 00381 for (auto& Op : Ops) { 00382 ID.AddPointer(Op.getNode()); 00383 ID.AddInteger(Op.getResNo()); 00384 } 00385 } 00386 00387 static void AddBinaryNodeIDCustom(FoldingSetNodeID &ID, bool nuw, bool nsw, 00388 bool exact) { 00389 ID.AddBoolean(nuw); 00390 ID.AddBoolean(nsw); 00391 ID.AddBoolean(exact); 00392 } 00393 00394 /// AddBinaryNodeIDCustom - Add BinarySDNodes special infos 00395 static void AddBinaryNodeIDCustom(FoldingSetNodeID &ID, unsigned Opcode, 00396 bool nuw, bool nsw, bool exact) { 00397 if (isBinOpWithFlags(Opcode)) 00398 AddBinaryNodeIDCustom(ID, nuw, nsw, exact); 00399 } 00400 00401 static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned short OpC, 00402 SDVTList VTList, ArrayRef<SDValue> OpList) { 00403 AddNodeIDOpcode(ID, OpC); 00404 AddNodeIDValueTypes(ID, VTList); 00405 AddNodeIDOperands(ID, OpList); 00406 } 00407 00408 /// AddNodeIDCustom - If this is an SDNode with special info, add this info to 00409 /// the NodeID data. 00410 static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N) { 00411 switch (N->getOpcode()) { 00412 case ISD::TargetExternalSymbol: 00413 case ISD::ExternalSymbol: 00414 llvm_unreachable("Should only be used on nodes with operands"); 00415 default: break; // Normal nodes don't need extra info. 00416 case ISD::TargetConstant: 00417 case ISD::Constant: { 00418 const ConstantSDNode *C = cast<ConstantSDNode>(N); 00419 ID.AddPointer(C->getConstantIntValue()); 00420 ID.AddBoolean(C->isOpaque()); 00421 break; 00422 } 00423 case ISD::TargetConstantFP: 00424 case ISD::ConstantFP: { 00425 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue()); 00426 break; 00427 } 00428 case ISD::TargetGlobalAddress: 00429 case ISD::GlobalAddress: 00430 case ISD::TargetGlobalTLSAddress: 00431 case ISD::GlobalTLSAddress: { 00432 const GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(N); 00433 ID.AddPointer(GA->getGlobal()); 00434 ID.AddInteger(GA->getOffset()); 00435 ID.AddInteger(GA->getTargetFlags()); 00436 ID.AddInteger(GA->getAddressSpace()); 00437 break; 00438 } 00439 case ISD::BasicBlock: 00440 ID.AddPointer(cast<BasicBlockSDNode>(N)->getBasicBlock()); 00441 break; 00442 case ISD::Register: 00443 ID.AddInteger(cast<RegisterSDNode>(N)->getReg()); 00444 break; 00445 case ISD::RegisterMask: 00446 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask()); 00447 break; 00448 case ISD::SRCVALUE: 00449 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue()); 00450 break; 00451 case ISD::FrameIndex: 00452 case ISD::TargetFrameIndex: 00453 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex()); 00454 break; 00455 case ISD::JumpTable: 00456 case ISD::TargetJumpTable: 00457 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex()); 00458 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags()); 00459 break; 00460 case ISD::ConstantPool: 00461 case ISD::TargetConstantPool: { 00462 const ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(N); 00463 ID.AddInteger(CP->getAlignment()); 00464 ID.AddInteger(CP->getOffset()); 00465 if (CP->isMachineConstantPoolEntry()) 00466 CP->getMachineCPVal()->addSelectionDAGCSEId(ID); 00467 else 00468 ID.AddPointer(CP->getConstVal()); 00469 ID.AddInteger(CP->getTargetFlags()); 00470 break; 00471 } 00472 case ISD::TargetIndex: { 00473 const TargetIndexSDNode *TI = cast<TargetIndexSDNode>(N); 00474 ID.AddInteger(TI->getIndex()); 00475 ID.AddInteger(TI->getOffset()); 00476 ID.AddInteger(TI->getTargetFlags()); 00477 break; 00478 } 00479 case ISD::LOAD: { 00480 const LoadSDNode *LD = cast<LoadSDNode>(N); 00481 ID.AddInteger(LD->getMemoryVT().getRawBits()); 00482 ID.AddInteger(LD->getRawSubclassData()); 00483 ID.AddInteger(LD->getPointerInfo().getAddrSpace()); 00484 break; 00485 } 00486 case ISD::STORE: { 00487 const StoreSDNode *ST = cast<StoreSDNode>(N); 00488 ID.AddInteger(ST->getMemoryVT().getRawBits()); 00489 ID.AddInteger(ST->getRawSubclassData()); 00490 ID.AddInteger(ST->getPointerInfo().getAddrSpace()); 00491 break; 00492 } 00493 case ISD::SDIV: 00494 case ISD::UDIV: 00495 case ISD::SRA: 00496 case ISD::SRL: 00497 case ISD::MUL: 00498 case ISD::ADD: 00499 case ISD::SUB: 00500 case ISD::SHL: { 00501 const BinaryWithFlagsSDNode *BinNode = cast<BinaryWithFlagsSDNode>(N); 00502 AddBinaryNodeIDCustom(ID, N->getOpcode(), BinNode->hasNoUnsignedWrap(), 00503 BinNode->hasNoSignedWrap(), BinNode->isExact()); 00504 break; 00505 } 00506 case ISD::ATOMIC_CMP_SWAP: 00507 case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS: 00508 case ISD::ATOMIC_SWAP: 00509 case ISD::ATOMIC_LOAD_ADD: 00510 case ISD::ATOMIC_LOAD_SUB: 00511 case ISD::ATOMIC_LOAD_AND: 00512 case ISD::ATOMIC_LOAD_OR: 00513 case ISD::ATOMIC_LOAD_XOR: 00514 case ISD::ATOMIC_LOAD_NAND: 00515 case ISD::ATOMIC_LOAD_MIN: 00516 case ISD::ATOMIC_LOAD_MAX: 00517 case ISD::ATOMIC_LOAD_UMIN: 00518 case ISD::ATOMIC_LOAD_UMAX: 00519 case ISD::ATOMIC_LOAD: 00520 case ISD::ATOMIC_STORE: { 00521 const AtomicSDNode *AT = cast<AtomicSDNode>(N); 00522 ID.AddInteger(AT->getMemoryVT().getRawBits()); 00523 ID.AddInteger(AT->getRawSubclassData()); 00524 ID.AddInteger(AT->getPointerInfo().getAddrSpace()); 00525 break; 00526 } 00527 case ISD::PREFETCH: { 00528 const MemSDNode *PF = cast<MemSDNode>(N); 00529 ID.AddInteger(PF->getPointerInfo().getAddrSpace()); 00530 break; 00531 } 00532 case ISD::VECTOR_SHUFFLE: { 00533 const ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(N); 00534 for (unsigned i = 0, e = N->getValueType(0).getVectorNumElements(); 00535 i != e; ++i) 00536 ID.AddInteger(SVN->getMaskElt(i)); 00537 break; 00538 } 00539 case ISD::TargetBlockAddress: 00540 case ISD::BlockAddress: { 00541 const BlockAddressSDNode *BA = cast<BlockAddressSDNode>(N); 00542 ID.AddPointer(BA->getBlockAddress()); 00543 ID.AddInteger(BA->getOffset()); 00544 ID.AddInteger(BA->getTargetFlags()); 00545 break; 00546 } 00547 } // end switch (N->getOpcode()) 00548 00549 // Target specific memory nodes could also have address spaces to check. 00550 if (N->isTargetMemoryOpcode()) 00551 ID.AddInteger(cast<MemSDNode>(N)->getPointerInfo().getAddrSpace()); 00552 } 00553 00554 /// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID 00555 /// data. 00556 static void AddNodeIDNode(FoldingSetNodeID &ID, const SDNode *N) { 00557 AddNodeIDOpcode(ID, N->getOpcode()); 00558 // Add the return value info. 00559 AddNodeIDValueTypes(ID, N->getVTList()); 00560 // Add the operand info. 00561 AddNodeIDOperands(ID, N->ops()); 00562 00563 // Handle SDNode leafs with special info. 00564 AddNodeIDCustom(ID, N); 00565 } 00566 00567 /// encodeMemSDNodeFlags - Generic routine for computing a value for use in 00568 /// the CSE map that carries volatility, temporalness, indexing mode, and 00569 /// extension/truncation information. 00570 /// 00571 static inline unsigned 00572 encodeMemSDNodeFlags(int ConvType, ISD::MemIndexedMode AM, bool isVolatile, 00573 bool isNonTemporal, bool isInvariant) { 00574 assert((ConvType & 3) == ConvType && 00575 "ConvType may not require more than 2 bits!"); 00576 assert((AM & 7) == AM && 00577 "AM may not require more than 3 bits!"); 00578 return ConvType | 00579 (AM << 2) | 00580 (isVolatile << 5) | 00581 (isNonTemporal << 6) | 00582 (isInvariant << 7); 00583 } 00584 00585 //===----------------------------------------------------------------------===// 00586 // SelectionDAG Class 00587 //===----------------------------------------------------------------------===// 00588 00589 /// doNotCSE - Return true if CSE should not be performed for this node. 00590 static bool doNotCSE(SDNode *N) { 00591 if (N->getValueType(0) == MVT::Glue) 00592 return true; // Never CSE anything that produces a flag. 00593 00594 switch (N->getOpcode()) { 00595 default: break; 00596 case ISD::HANDLENODE: 00597 case ISD::EH_LABEL: 00598 return true; // Never CSE these nodes. 00599 } 00600 00601 // Check that remaining values produced are not flags. 00602 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i) 00603 if (N->getValueType(i) == MVT::Glue) 00604 return true; // Never CSE anything that produces a flag. 00605 00606 return false; 00607 } 00608 00609 /// RemoveDeadNodes - This method deletes all unreachable nodes in the 00610 /// SelectionDAG. 00611 void SelectionDAG::RemoveDeadNodes() { 00612 // Create a dummy node (which is not added to allnodes), that adds a reference 00613 // to the root node, preventing it from being deleted. 00614 HandleSDNode Dummy(getRoot()); 00615 00616 SmallVector<SDNode*, 128> DeadNodes; 00617 00618 // Add all obviously-dead nodes to the DeadNodes worklist. 00619 for (allnodes_iterator I = allnodes_begin(), E = allnodes_end(); I != E; ++I) 00620 if (I->use_empty()) 00621 DeadNodes.push_back(I); 00622 00623 RemoveDeadNodes(DeadNodes); 00624 00625 // If the root changed (e.g. it was a dead load, update the root). 00626 setRoot(Dummy.getValue()); 00627 } 00628 00629 /// RemoveDeadNodes - This method deletes the unreachable nodes in the 00630 /// given list, and any nodes that become unreachable as a result. 00631 void SelectionDAG::RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes) { 00632 00633 // Process the worklist, deleting the nodes and adding their uses to the 00634 // worklist. 00635 while (!DeadNodes.empty()) { 00636 SDNode *N = DeadNodes.pop_back_val(); 00637 00638 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next) 00639 DUL->NodeDeleted(N, nullptr); 00640 00641 // Take the node out of the appropriate CSE map. 00642 RemoveNodeFromCSEMaps(N); 00643 00644 // Next, brutally remove the operand list. This is safe to do, as there are 00645 // no cycles in the graph. 00646 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) { 00647 SDUse &Use = *I++; 00648 SDNode *Operand = Use.getNode(); 00649 Use.set(SDValue()); 00650 00651 // Now that we removed this operand, see if there are no uses of it left. 00652 if (Operand->use_empty()) 00653 DeadNodes.push_back(Operand); 00654 } 00655 00656 DeallocateNode(N); 00657 } 00658 } 00659 00660 void SelectionDAG::RemoveDeadNode(SDNode *N){ 00661 SmallVector<SDNode*, 16> DeadNodes(1, N); 00662 00663 // Create a dummy node that adds a reference to the root node, preventing 00664 // it from being deleted. (This matters if the root is an operand of the 00665 // dead node.) 00666 HandleSDNode Dummy(getRoot()); 00667 00668 RemoveDeadNodes(DeadNodes); 00669 } 00670 00671 void SelectionDAG::DeleteNode(SDNode *N) { 00672 // First take this out of the appropriate CSE map. 00673 RemoveNodeFromCSEMaps(N); 00674 00675 // Finally, remove uses due to operands of this node, remove from the 00676 // AllNodes list, and delete the node. 00677 DeleteNodeNotInCSEMaps(N); 00678 } 00679 00680 void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) { 00681 assert(N != AllNodes.begin() && "Cannot delete the entry node!"); 00682 assert(N->use_empty() && "Cannot delete a node that is not dead!"); 00683 00684 // Drop all of the operands and decrement used node's use counts. 00685 N->DropOperands(); 00686 00687 DeallocateNode(N); 00688 } 00689 00690 void SelectionDAG::DeallocateNode(SDNode *N) { 00691 if (N->OperandsNeedDelete) 00692 delete[] N->OperandList; 00693 00694 // Set the opcode to DELETED_NODE to help catch bugs when node 00695 // memory is reallocated. 00696 N->NodeType = ISD::DELETED_NODE; 00697 00698 NodeAllocator.Deallocate(AllNodes.remove(N)); 00699 00700 // If any of the SDDbgValue nodes refer to this SDNode, invalidate them. 00701 ArrayRef<SDDbgValue*> DbgVals = DbgInfo->getSDDbgValues(N); 00702 for (unsigned i = 0, e = DbgVals.size(); i != e; ++i) 00703 DbgVals[i]->setIsInvalidated(); 00704 } 00705 00706 #ifndef NDEBUG 00707 /// VerifySDNode - Sanity check the given SDNode. Aborts if it is invalid. 00708 static void VerifySDNode(SDNode *N) { 00709 switch (N->getOpcode()) { 00710 default: 00711 break; 00712 case ISD::BUILD_PAIR: { 00713 EVT VT = N->getValueType(0); 00714 assert(N->getNumValues() == 1 && "Too many results!"); 00715 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) && 00716 "Wrong return type!"); 00717 assert(N->getNumOperands() == 2 && "Wrong number of operands!"); 00718 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() && 00719 "Mismatched operand types!"); 00720 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() && 00721 "Wrong operand type!"); 00722 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() && 00723 "Wrong return type size"); 00724 break; 00725 } 00726 case ISD::BUILD_VECTOR: { 00727 assert(N->getNumValues() == 1 && "Too many results!"); 00728 assert(N->getValueType(0).isVector() && "Wrong return type!"); 00729 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() && 00730 "Wrong number of operands!"); 00731 EVT EltVT = N->getValueType(0).getVectorElementType(); 00732 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I) { 00733 assert((I->getValueType() == EltVT || 00734 (EltVT.isInteger() && I->getValueType().isInteger() && 00735 EltVT.bitsLE(I->getValueType()))) && 00736 "Wrong operand type!"); 00737 assert(I->getValueType() == N->getOperand(0).getValueType() && 00738 "Operands must all have the same type"); 00739 } 00740 break; 00741 } 00742 } 00743 } 00744 #endif // NDEBUG 00745 00746 /// \brief Insert a newly allocated node into the DAG. 00747 /// 00748 /// Handles insertion into the all nodes list and CSE map, as well as 00749 /// verification and other common operations when a new node is allocated. 00750 void SelectionDAG::InsertNode(SDNode *N) { 00751 AllNodes.push_back(N); 00752 #ifndef NDEBUG 00753 VerifySDNode(N); 00754 #endif 00755 } 00756 00757 /// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that 00758 /// correspond to it. This is useful when we're about to delete or repurpose 00759 /// the node. We don't want future request for structurally identical nodes 00760 /// to return N anymore. 00761 bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) { 00762 bool Erased = false; 00763 switch (N->getOpcode()) { 00764 case ISD::HANDLENODE: return false; // noop. 00765 case ISD::CONDCODE: 00766 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] && 00767 "Cond code doesn't exist!"); 00768 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr; 00769 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr; 00770 break; 00771 case ISD::ExternalSymbol: 00772 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol()); 00773 break; 00774 case ISD::TargetExternalSymbol: { 00775 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N); 00776 Erased = TargetExternalSymbols.erase( 00777 std::pair<std::string,unsigned char>(ESN->getSymbol(), 00778 ESN->getTargetFlags())); 00779 break; 00780 } 00781 case ISD::VALUETYPE: { 00782 EVT VT = cast<VTSDNode>(N)->getVT(); 00783 if (VT.isExtended()) { 00784 Erased = ExtendedValueTypeNodes.erase(VT); 00785 } else { 00786 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr; 00787 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr; 00788 } 00789 break; 00790 } 00791 default: 00792 // Remove it from the CSE Map. 00793 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!"); 00794 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!"); 00795 Erased = CSEMap.RemoveNode(N); 00796 break; 00797 } 00798 #ifndef NDEBUG 00799 // Verify that the node was actually in one of the CSE maps, unless it has a 00800 // flag result (which cannot be CSE'd) or is one of the special cases that are 00801 // not subject to CSE. 00802 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue && 00803 !N->isMachineOpcode() && !doNotCSE(N)) { 00804 N->dump(this); 00805 dbgs() << "\n"; 00806 llvm_unreachable("Node is not in map!"); 00807 } 00808 #endif 00809 return Erased; 00810 } 00811 00812 /// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE 00813 /// maps and modified in place. Add it back to the CSE maps, unless an identical 00814 /// node already exists, in which case transfer all its users to the existing 00815 /// node. This transfer can potentially trigger recursive merging. 00816 /// 00817 void 00818 SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) { 00819 // For node types that aren't CSE'd, just act as if no identical node 00820 // already exists. 00821 if (!doNotCSE(N)) { 00822 SDNode *Existing = CSEMap.GetOrInsertNode(N); 00823 if (Existing != N) { 00824 // If there was already an existing matching node, use ReplaceAllUsesWith 00825 // to replace the dead one with the existing one. This can cause 00826 // recursive merging of other unrelated nodes down the line. 00827 ReplaceAllUsesWith(N, Existing); 00828 00829 // N is now dead. Inform the listeners and delete it. 00830 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next) 00831 DUL->NodeDeleted(N, Existing); 00832 DeleteNodeNotInCSEMaps(N); 00833 return; 00834 } 00835 } 00836 00837 // If the node doesn't already exist, we updated it. Inform listeners. 00838 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next) 00839 DUL->NodeUpdated(N); 00840 } 00841 00842 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands 00843 /// were replaced with those specified. If this node is never memoized, 00844 /// return null, otherwise return a pointer to the slot it would take. If a 00845 /// node already exists with these operands, the slot will be non-null. 00846 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op, 00847 void *&InsertPos) { 00848 if (doNotCSE(N)) 00849 return nullptr; 00850 00851 SDValue Ops[] = { Op }; 00852 FoldingSetNodeID ID; 00853 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops); 00854 AddNodeIDCustom(ID, N); 00855 SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos); 00856 return Node; 00857 } 00858 00859 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands 00860 /// were replaced with those specified. If this node is never memoized, 00861 /// return null, otherwise return a pointer to the slot it would take. If a 00862 /// node already exists with these operands, the slot will be non-null. 00863 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, 00864 SDValue Op1, SDValue Op2, 00865 void *&InsertPos) { 00866 if (doNotCSE(N)) 00867 return nullptr; 00868 00869 SDValue Ops[] = { Op1, Op2 }; 00870 FoldingSetNodeID ID; 00871 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops); 00872 AddNodeIDCustom(ID, N); 00873 SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos); 00874 return Node; 00875 } 00876 00877 00878 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands 00879 /// were replaced with those specified. If this node is never memoized, 00880 /// return null, otherwise return a pointer to the slot it would take. If a 00881 /// node already exists with these operands, the slot will be non-null. 00882 SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops, 00883 void *&InsertPos) { 00884 if (doNotCSE(N)) 00885 return nullptr; 00886 00887 FoldingSetNodeID ID; 00888 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops); 00889 AddNodeIDCustom(ID, N); 00890 SDNode *Node = CSEMap.FindNodeOrInsertPos(ID, InsertPos); 00891 return Node; 00892 } 00893 00894 /// getEVTAlignment - Compute the default alignment value for the 00895 /// given type. 00896 /// 00897 unsigned SelectionDAG::getEVTAlignment(EVT VT) const { 00898 Type *Ty = VT == MVT::iPTR ? 00899 PointerType::get(Type::getInt8Ty(*getContext()), 0) : 00900 VT.getTypeForEVT(*getContext()); 00901 00902 return TM.getSubtargetImpl() 00903 ->getTargetLowering() 00904 ->getDataLayout() 00905 ->getABITypeAlignment(Ty); 00906 } 00907 00908 // EntryNode could meaningfully have debug info if we can find it... 00909 SelectionDAG::SelectionDAG(const TargetMachine &tm, CodeGenOpt::Level OL) 00910 : TM(tm), TSI(tm.getSubtargetImpl()->getSelectionDAGInfo()), TLI(nullptr), 00911 OptLevel(OL), 00912 EntryNode(ISD::EntryToken, 0, DebugLoc(), getVTList(MVT::Other)), 00913 Root(getEntryNode()), NewNodesMustHaveLegalTypes(false), 00914 UpdateListeners(nullptr) { 00915 AllNodes.push_back(&EntryNode); 00916 DbgInfo = new SDDbgInfo(); 00917 } 00918 00919 void SelectionDAG::init(MachineFunction &mf, const TargetLowering *tli) { 00920 MF = &mf; 00921 TLI = tli; 00922 Context = &mf.getFunction()->getContext(); 00923 } 00924 00925 SelectionDAG::~SelectionDAG() { 00926 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners"); 00927 allnodes_clear(); 00928 delete DbgInfo; 00929 } 00930 00931 void SelectionDAG::allnodes_clear() { 00932 assert(&*AllNodes.begin() == &EntryNode); 00933 AllNodes.remove(AllNodes.begin()); 00934 while (!AllNodes.empty()) 00935 DeallocateNode(AllNodes.begin()); 00936 } 00937 00938 BinarySDNode *SelectionDAG::GetBinarySDNode(unsigned Opcode, SDLoc DL, 00939 SDVTList VTs, SDValue N1, 00940 SDValue N2, bool nuw, bool nsw, 00941 bool exact) { 00942 if (isBinOpWithFlags(Opcode)) { 00943 BinaryWithFlagsSDNode *FN = new (NodeAllocator) BinaryWithFlagsSDNode( 00944 Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs, N1, N2); 00945 FN->setHasNoUnsignedWrap(nuw); 00946 FN->setHasNoSignedWrap(nsw); 00947 FN->setIsExact(exact); 00948 00949 return FN; 00950 } 00951 00952 BinarySDNode *N = new (NodeAllocator) 00953 BinarySDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs, N1, N2); 00954 return N; 00955 } 00956 00957 void SelectionDAG::clear() { 00958 allnodes_clear(); 00959 OperandAllocator.Reset(); 00960 CSEMap.clear(); 00961 00962 ExtendedValueTypeNodes.clear(); 00963 ExternalSymbols.clear(); 00964 TargetExternalSymbols.clear(); 00965 std::fill(CondCodeNodes.begin(), CondCodeNodes.end(), 00966 static_cast<CondCodeSDNode*>(nullptr)); 00967 std::fill(ValueTypeNodes.begin(), ValueTypeNodes.end(), 00968 static_cast<SDNode*>(nullptr)); 00969 00970 EntryNode.UseList = nullptr; 00971 AllNodes.push_back(&EntryNode); 00972 Root = getEntryNode(); 00973 DbgInfo->clear(); 00974 } 00975 00976 SDValue SelectionDAG::getAnyExtOrTrunc(SDValue Op, SDLoc DL, EVT VT) { 00977 return VT.bitsGT(Op.getValueType()) ? 00978 getNode(ISD::ANY_EXTEND, DL, VT, Op) : 00979 getNode(ISD::TRUNCATE, DL, VT, Op); 00980 } 00981 00982 SDValue SelectionDAG::getSExtOrTrunc(SDValue Op, SDLoc DL, EVT VT) { 00983 return VT.bitsGT(Op.getValueType()) ? 00984 getNode(ISD::SIGN_EXTEND, DL, VT, Op) : 00985 getNode(ISD::TRUNCATE, DL, VT, Op); 00986 } 00987 00988 SDValue SelectionDAG::getZExtOrTrunc(SDValue Op, SDLoc DL, EVT VT) { 00989 return VT.bitsGT(Op.getValueType()) ? 00990 getNode(ISD::ZERO_EXTEND, DL, VT, Op) : 00991 getNode(ISD::TRUNCATE, DL, VT, Op); 00992 } 00993 00994 SDValue SelectionDAG::getBoolExtOrTrunc(SDValue Op, SDLoc SL, EVT VT, 00995 EVT OpVT) { 00996 if (VT.bitsLE(Op.getValueType())) 00997 return getNode(ISD::TRUNCATE, SL, VT, Op); 00998 00999 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT); 01000 return getNode(TLI->getExtendForContent(BType), SL, VT, Op); 01001 } 01002 01003 SDValue SelectionDAG::getZeroExtendInReg(SDValue Op, SDLoc DL, EVT VT) { 01004 assert(!VT.isVector() && 01005 "getZeroExtendInReg should use the vector element type instead of " 01006 "the vector type!"); 01007 if (Op.getValueType() == VT) return Op; 01008 unsigned BitWidth = Op.getValueType().getScalarType().getSizeInBits(); 01009 APInt Imm = APInt::getLowBitsSet(BitWidth, 01010 VT.getSizeInBits()); 01011 return getNode(ISD::AND, DL, Op.getValueType(), Op, 01012 getConstant(Imm, Op.getValueType())); 01013 } 01014 01015 SDValue SelectionDAG::getAnyExtendVectorInReg(SDValue Op, SDLoc DL, EVT VT) { 01016 assert(VT.isVector() && "This DAG node is restricted to vector types."); 01017 assert(VT.getSizeInBits() == Op.getValueType().getSizeInBits() && 01018 "The sizes of the input and result must match in order to perform the " 01019 "extend in-register."); 01020 assert(VT.getVectorNumElements() < Op.getValueType().getVectorNumElements() && 01021 "The destination vector type must have fewer lanes than the input."); 01022 return getNode(ISD::ANY_EXTEND_VECTOR_INREG, DL, VT, Op); 01023 } 01024 01025 SDValue SelectionDAG::getSignExtendVectorInReg(SDValue Op, SDLoc DL, EVT VT) { 01026 assert(VT.isVector() && "This DAG node is restricted to vector types."); 01027 assert(VT.getSizeInBits() == Op.getValueType().getSizeInBits() && 01028 "The sizes of the input and result must match in order to perform the " 01029 "extend in-register."); 01030 assert(VT.getVectorNumElements() < Op.getValueType().getVectorNumElements() && 01031 "The destination vector type must have fewer lanes than the input."); 01032 return getNode(ISD::SIGN_EXTEND_VECTOR_INREG, DL, VT, Op); 01033 } 01034 01035 SDValue SelectionDAG::getZeroExtendVectorInReg(SDValue Op, SDLoc DL, EVT VT) { 01036 assert(VT.isVector() && "This DAG node is restricted to vector types."); 01037 assert(VT.getSizeInBits() == Op.getValueType().getSizeInBits() && 01038 "The sizes of the input and result must match in order to perform the " 01039 "extend in-register."); 01040 assert(VT.getVectorNumElements() < Op.getValueType().getVectorNumElements() && 01041 "The destination vector type must have fewer lanes than the input."); 01042 return getNode(ISD::ZERO_EXTEND_VECTOR_INREG, DL, VT, Op); 01043 } 01044 01045 /// getNOT - Create a bitwise NOT operation as (XOR Val, -1). 01046 /// 01047 SDValue SelectionDAG::getNOT(SDLoc DL, SDValue Val, EVT VT) { 01048 EVT EltVT = VT.getScalarType(); 01049 SDValue NegOne = 01050 getConstant(APInt::getAllOnesValue(EltVT.getSizeInBits()), VT); 01051 return getNode(ISD::XOR, DL, VT, Val, NegOne); 01052 } 01053 01054 SDValue SelectionDAG::getLogicalNOT(SDLoc DL, SDValue Val, EVT VT) { 01055 EVT EltVT = VT.getScalarType(); 01056 SDValue TrueValue; 01057 switch (TLI->getBooleanContents(VT)) { 01058 case TargetLowering::ZeroOrOneBooleanContent: 01059 case TargetLowering::UndefinedBooleanContent: 01060 TrueValue = getConstant(1, VT); 01061 break; 01062 case TargetLowering::ZeroOrNegativeOneBooleanContent: 01063 TrueValue = getConstant(APInt::getAllOnesValue(EltVT.getSizeInBits()), 01064 VT); 01065 break; 01066 } 01067 return getNode(ISD::XOR, DL, VT, Val, TrueValue); 01068 } 01069 01070 SDValue SelectionDAG::getConstant(uint64_t Val, EVT VT, bool isT, bool isO) { 01071 EVT EltVT = VT.getScalarType(); 01072 assert((EltVT.getSizeInBits() >= 64 || 01073 (uint64_t)((int64_t)Val >> EltVT.getSizeInBits()) + 1 < 2) && 01074 "getConstant with a uint64_t value that doesn't fit in the type!"); 01075 return getConstant(APInt(EltVT.getSizeInBits(), Val), VT, isT, isO); 01076 } 01077 01078 SDValue SelectionDAG::getConstant(const APInt &Val, EVT VT, bool isT, bool isO) 01079 { 01080 return getConstant(*ConstantInt::get(*Context, Val), VT, isT, isO); 01081 } 01082 01083 SDValue SelectionDAG::getConstant(const ConstantInt &Val, EVT VT, bool isT, 01084 bool isO) { 01085 assert(VT.isInteger() && "Cannot create FP integer constant!"); 01086 01087 EVT EltVT = VT.getScalarType(); 01088 const ConstantInt *Elt = &Val; 01089 01090 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 01091 01092 // In some cases the vector type is legal but the element type is illegal and 01093 // needs to be promoted, for example v8i8 on ARM. In this case, promote the 01094 // inserted value (the type does not need to match the vector element type). 01095 // Any extra bits introduced will be truncated away. 01096 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) == 01097 TargetLowering::TypePromoteInteger) { 01098 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT); 01099 APInt NewVal = Elt->getValue().zext(EltVT.getSizeInBits()); 01100 Elt = ConstantInt::get(*getContext(), NewVal); 01101 } 01102 // In other cases the element type is illegal and needs to be expanded, for 01103 // example v2i64 on MIPS32. In this case, find the nearest legal type, split 01104 // the value into n parts and use a vector type with n-times the elements. 01105 // Then bitcast to the type requested. 01106 // Legalizing constants too early makes the DAGCombiner's job harder so we 01107 // only legalize if the DAG tells us we must produce legal types. 01108 else if (NewNodesMustHaveLegalTypes && VT.isVector() && 01109 TLI->getTypeAction(*getContext(), EltVT) == 01110 TargetLowering::TypeExpandInteger) { 01111 APInt NewVal = Elt->getValue(); 01112 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT); 01113 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits(); 01114 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits; 01115 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts); 01116 01117 // Check the temporary vector is the correct size. If this fails then 01118 // getTypeToTransformTo() probably returned a type whose size (in bits) 01119 // isn't a power-of-2 factor of the requested type size. 01120 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits()); 01121 01122 SmallVector<SDValue, 2> EltParts; 01123 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i) { 01124 EltParts.push_back(getConstant(NewVal.lshr(i * ViaEltSizeInBits) 01125 .trunc(ViaEltSizeInBits), 01126 ViaEltVT, isT, isO)); 01127 } 01128 01129 // EltParts is currently in little endian order. If we actually want 01130 // big-endian order then reverse it now. 01131 if (TLI->isBigEndian()) 01132 std::reverse(EltParts.begin(), EltParts.end()); 01133 01134 // The elements must be reversed when the element order is different 01135 // to the endianness of the elements (because the BITCAST is itself a 01136 // vector shuffle in this situation). However, we do not need any code to 01137 // perform this reversal because getConstant() is producing a vector 01138 // splat. 01139 // This situation occurs in MIPS MSA. 01140 01141 SmallVector<SDValue, 8> Ops; 01142 for (unsigned i = 0; i < VT.getVectorNumElements(); ++i) 01143 Ops.insert(Ops.end(), EltParts.begin(), EltParts.end()); 01144 01145 SDValue Result = getNode(ISD::BITCAST, SDLoc(), VT, 01146 getNode(ISD::BUILD_VECTOR, SDLoc(), ViaVecVT, 01147 Ops)); 01148 return Result; 01149 } 01150 01151 assert(Elt->getBitWidth() == EltVT.getSizeInBits() && 01152 "APInt size does not match type size!"); 01153 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant; 01154 FoldingSetNodeID ID; 01155 AddNodeIDNode(ID, Opc, getVTList(EltVT), None); 01156 ID.AddPointer(Elt); 01157 ID.AddBoolean(isO); 01158 void *IP = nullptr; 01159 SDNode *N = nullptr; 01160 if ((N = CSEMap.FindNodeOrInsertPos(ID, IP))) 01161 if (!VT.isVector()) 01162 return SDValue(N, 0); 01163 01164 if (!N) { 01165 N = new (NodeAllocator) ConstantSDNode(isT, isO, Elt, EltVT); 01166 CSEMap.InsertNode(N, IP); 01167 InsertNode(N); 01168 } 01169 01170 SDValue Result(N, 0); 01171 if (VT.isVector()) { 01172 SmallVector<SDValue, 8> Ops; 01173 Ops.assign(VT.getVectorNumElements(), Result); 01174 Result = getNode(ISD::BUILD_VECTOR, SDLoc(), VT, Ops); 01175 } 01176 return Result; 01177 } 01178 01179 SDValue SelectionDAG::getIntPtrConstant(uint64_t Val, bool isTarget) { 01180 return getConstant(Val, 01181 TM.getSubtargetImpl()->getTargetLowering()->getPointerTy(), 01182 isTarget); 01183 } 01184 01185 01186 SDValue SelectionDAG::getConstantFP(const APFloat& V, EVT VT, bool isTarget) { 01187 return getConstantFP(*ConstantFP::get(*getContext(), V), VT, isTarget); 01188 } 01189 01190 SDValue SelectionDAG::getConstantFP(const ConstantFP& V, EVT VT, bool isTarget){ 01191 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!"); 01192 01193 EVT EltVT = VT.getScalarType(); 01194 01195 // Do the map lookup using the actual bit pattern for the floating point 01196 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and 01197 // we don't have issues with SNANs. 01198 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP; 01199 FoldingSetNodeID ID; 01200 AddNodeIDNode(ID, Opc, getVTList(EltVT), None); 01201 ID.AddPointer(&V); 01202 void *IP = nullptr; 01203 SDNode *N = nullptr; 01204 if ((N = CSEMap.FindNodeOrInsertPos(ID, IP))) 01205 if (!VT.isVector()) 01206 return SDValue(N, 0); 01207 01208 if (!N) { 01209 N = new (NodeAllocator) ConstantFPSDNode(isTarget, &V, EltVT); 01210 CSEMap.InsertNode(N, IP); 01211 InsertNode(N); 01212 } 01213 01214 SDValue Result(N, 0); 01215 if (VT.isVector()) { 01216 SmallVector<SDValue, 8> Ops; 01217 Ops.assign(VT.getVectorNumElements(), Result); 01218 // FIXME SDLoc info might be appropriate here 01219 Result = getNode(ISD::BUILD_VECTOR, SDLoc(), VT, Ops); 01220 } 01221 return Result; 01222 } 01223 01224 SDValue SelectionDAG::getConstantFP(double Val, EVT VT, bool isTarget) { 01225 EVT EltVT = VT.getScalarType(); 01226 if (EltVT==MVT::f32) 01227 return getConstantFP(APFloat((float)Val), VT, isTarget); 01228 else if (EltVT==MVT::f64) 01229 return getConstantFP(APFloat(Val), VT, isTarget); 01230 else if (EltVT==MVT::f80 || EltVT==MVT::f128 || EltVT==MVT::ppcf128 || 01231 EltVT==MVT::f16) { 01232 bool ignored; 01233 APFloat apf = APFloat(Val); 01234 apf.convert(EVTToAPFloatSemantics(EltVT), APFloat::rmNearestTiesToEven, 01235 &ignored); 01236 return getConstantFP(apf, VT, isTarget); 01237 } else 01238 llvm_unreachable("Unsupported type in getConstantFP"); 01239 } 01240 01241 SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV, SDLoc DL, 01242 EVT VT, int64_t Offset, 01243 bool isTargetGA, 01244 unsigned char TargetFlags) { 01245 assert((TargetFlags == 0 || isTargetGA) && 01246 "Cannot set target flags on target-independent globals"); 01247 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 01248 01249 // Truncate (with sign-extension) the offset value to the pointer size. 01250 unsigned BitWidth = TLI->getPointerTypeSizeInBits(GV->getType()); 01251 if (BitWidth < 64) 01252 Offset = SignExtend64(Offset, BitWidth); 01253 01254 unsigned Opc; 01255 if (GV->isThreadLocal()) 01256 Opc = isTargetGA ? ISD::TargetGlobalTLSAddress : ISD::GlobalTLSAddress; 01257 else 01258 Opc = isTargetGA ? ISD::TargetGlobalAddress : ISD::GlobalAddress; 01259 01260 FoldingSetNodeID ID; 01261 AddNodeIDNode(ID, Opc, getVTList(VT), None); 01262 ID.AddPointer(GV); 01263 ID.AddInteger(Offset); 01264 ID.AddInteger(TargetFlags); 01265 ID.AddInteger(GV->getType()->getAddressSpace()); 01266 void *IP = nullptr; 01267 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01268 return SDValue(E, 0); 01269 01270 SDNode *N = new (NodeAllocator) GlobalAddressSDNode(Opc, DL.getIROrder(), 01271 DL.getDebugLoc(), GV, VT, 01272 Offset, TargetFlags); 01273 CSEMap.InsertNode(N, IP); 01274 InsertNode(N); 01275 return SDValue(N, 0); 01276 } 01277 01278 SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) { 01279 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex; 01280 FoldingSetNodeID ID; 01281 AddNodeIDNode(ID, Opc, getVTList(VT), None); 01282 ID.AddInteger(FI); 01283 void *IP = nullptr; 01284 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01285 return SDValue(E, 0); 01286 01287 SDNode *N = new (NodeAllocator) FrameIndexSDNode(FI, VT, isTarget); 01288 CSEMap.InsertNode(N, IP); 01289 InsertNode(N); 01290 return SDValue(N, 0); 01291 } 01292 01293 SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget, 01294 unsigned char TargetFlags) { 01295 assert((TargetFlags == 0 || isTarget) && 01296 "Cannot set target flags on target-independent jump tables"); 01297 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable; 01298 FoldingSetNodeID ID; 01299 AddNodeIDNode(ID, Opc, getVTList(VT), None); 01300 ID.AddInteger(JTI); 01301 ID.AddInteger(TargetFlags); 01302 void *IP = nullptr; 01303 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01304 return SDValue(E, 0); 01305 01306 SDNode *N = new (NodeAllocator) JumpTableSDNode(JTI, VT, isTarget, 01307 TargetFlags); 01308 CSEMap.InsertNode(N, IP); 01309 InsertNode(N); 01310 return SDValue(N, 0); 01311 } 01312 01313 SDValue SelectionDAG::getConstantPool(const Constant *C, EVT VT, 01314 unsigned Alignment, int Offset, 01315 bool isTarget, 01316 unsigned char TargetFlags) { 01317 assert((TargetFlags == 0 || isTarget) && 01318 "Cannot set target flags on target-independent globals"); 01319 if (Alignment == 0) 01320 Alignment = TM.getSubtargetImpl() 01321 ->getTargetLowering() 01322 ->getDataLayout() 01323 ->getPrefTypeAlignment(C->getType()); 01324 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool; 01325 FoldingSetNodeID ID; 01326 AddNodeIDNode(ID, Opc, getVTList(VT), None); 01327 ID.AddInteger(Alignment); 01328 ID.AddInteger(Offset); 01329 ID.AddPointer(C); 01330 ID.AddInteger(TargetFlags); 01331 void *IP = nullptr; 01332 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01333 return SDValue(E, 0); 01334 01335 SDNode *N = new (NodeAllocator) ConstantPoolSDNode(isTarget, C, VT, Offset, 01336 Alignment, TargetFlags); 01337 CSEMap.InsertNode(N, IP); 01338 InsertNode(N); 01339 return SDValue(N, 0); 01340 } 01341 01342 01343 SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, EVT VT, 01344 unsigned Alignment, int Offset, 01345 bool isTarget, 01346 unsigned char TargetFlags) { 01347 assert((TargetFlags == 0 || isTarget) && 01348 "Cannot set target flags on target-independent globals"); 01349 if (Alignment == 0) 01350 Alignment = TM.getSubtargetImpl() 01351 ->getTargetLowering() 01352 ->getDataLayout() 01353 ->getPrefTypeAlignment(C->getType()); 01354 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool; 01355 FoldingSetNodeID ID; 01356 AddNodeIDNode(ID, Opc, getVTList(VT), None); 01357 ID.AddInteger(Alignment); 01358 ID.AddInteger(Offset); 01359 C->addSelectionDAGCSEId(ID); 01360 ID.AddInteger(TargetFlags); 01361 void *IP = nullptr; 01362 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01363 return SDValue(E, 0); 01364 01365 SDNode *N = new (NodeAllocator) ConstantPoolSDNode(isTarget, C, VT, Offset, 01366 Alignment, TargetFlags); 01367 CSEMap.InsertNode(N, IP); 01368 InsertNode(N); 01369 return SDValue(N, 0); 01370 } 01371 01372 SDValue SelectionDAG::getTargetIndex(int Index, EVT VT, int64_t Offset, 01373 unsigned char TargetFlags) { 01374 FoldingSetNodeID ID; 01375 AddNodeIDNode(ID, ISD::TargetIndex, getVTList(VT), None); 01376 ID.AddInteger(Index); 01377 ID.AddInteger(Offset); 01378 ID.AddInteger(TargetFlags); 01379 void *IP = nullptr; 01380 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01381 return SDValue(E, 0); 01382 01383 SDNode *N = new (NodeAllocator) TargetIndexSDNode(Index, VT, Offset, 01384 TargetFlags); 01385 CSEMap.InsertNode(N, IP); 01386 InsertNode(N); 01387 return SDValue(N, 0); 01388 } 01389 01390 SDValue SelectionDAG::getBasicBlock(MachineBasicBlock *MBB) { 01391 FoldingSetNodeID ID; 01392 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), None); 01393 ID.AddPointer(MBB); 01394 void *IP = nullptr; 01395 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01396 return SDValue(E, 0); 01397 01398 SDNode *N = new (NodeAllocator) BasicBlockSDNode(MBB); 01399 CSEMap.InsertNode(N, IP); 01400 InsertNode(N); 01401 return SDValue(N, 0); 01402 } 01403 01404 SDValue SelectionDAG::getValueType(EVT VT) { 01405 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >= 01406 ValueTypeNodes.size()) 01407 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1); 01408 01409 SDNode *&N = VT.isExtended() ? 01410 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy]; 01411 01412 if (N) return SDValue(N, 0); 01413 N = new (NodeAllocator) VTSDNode(VT); 01414 InsertNode(N); 01415 return SDValue(N, 0); 01416 } 01417 01418 SDValue SelectionDAG::getExternalSymbol(const char *Sym, EVT VT) { 01419 SDNode *&N = ExternalSymbols[Sym]; 01420 if (N) return SDValue(N, 0); 01421 N = new (NodeAllocator) ExternalSymbolSDNode(false, Sym, 0, VT); 01422 InsertNode(N); 01423 return SDValue(N, 0); 01424 } 01425 01426 SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, EVT VT, 01427 unsigned char TargetFlags) { 01428 SDNode *&N = 01429 TargetExternalSymbols[std::pair<std::string,unsigned char>(Sym, 01430 TargetFlags)]; 01431 if (N) return SDValue(N, 0); 01432 N = new (NodeAllocator) ExternalSymbolSDNode(true, Sym, TargetFlags, VT); 01433 InsertNode(N); 01434 return SDValue(N, 0); 01435 } 01436 01437 SDValue SelectionDAG::getCondCode(ISD::CondCode Cond) { 01438 if ((unsigned)Cond >= CondCodeNodes.size()) 01439 CondCodeNodes.resize(Cond+1); 01440 01441 if (!CondCodeNodes[Cond]) { 01442 CondCodeSDNode *N = new (NodeAllocator) CondCodeSDNode(Cond); 01443 CondCodeNodes[Cond] = N; 01444 InsertNode(N); 01445 } 01446 01447 return SDValue(CondCodeNodes[Cond], 0); 01448 } 01449 01450 // commuteShuffle - swaps the values of N1 and N2, and swaps all indices in 01451 // the shuffle mask M that point at N1 to point at N2, and indices that point 01452 // N2 to point at N1. 01453 static void commuteShuffle(SDValue &N1, SDValue &N2, SmallVectorImpl<int> &M) { 01454 std::swap(N1, N2); 01455 int NElts = M.size(); 01456 for (int i = 0; i != NElts; ++i) { 01457 if (M[i] >= NElts) 01458 M[i] -= NElts; 01459 else if (M[i] >= 0) 01460 M[i] += NElts; 01461 } 01462 } 01463 01464 SDValue SelectionDAG::getVectorShuffle(EVT VT, SDLoc dl, SDValue N1, 01465 SDValue N2, const int *Mask) { 01466 assert(VT == N1.getValueType() && VT == N2.getValueType() && 01467 "Invalid VECTOR_SHUFFLE"); 01468 01469 // Canonicalize shuffle undef, undef -> undef 01470 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() == ISD::UNDEF) 01471 return getUNDEF(VT); 01472 01473 // Validate that all indices in Mask are within the range of the elements 01474 // input to the shuffle. 01475 unsigned NElts = VT.getVectorNumElements(); 01476 SmallVector<int, 8> MaskVec; 01477 for (unsigned i = 0; i != NElts; ++i) { 01478 assert(Mask[i] < (int)(NElts * 2) && "Index out of range"); 01479 MaskVec.push_back(Mask[i]); 01480 } 01481 01482 // Canonicalize shuffle v, v -> v, undef 01483 if (N1 == N2) { 01484 N2 = getUNDEF(VT); 01485 for (unsigned i = 0; i != NElts; ++i) 01486 if (MaskVec[i] >= (int)NElts) MaskVec[i] -= NElts; 01487 } 01488 01489 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask. 01490 if (N1.getOpcode() == ISD::UNDEF) 01491 commuteShuffle(N1, N2, MaskVec); 01492 01493 // Canonicalize all index into lhs, -> shuffle lhs, undef 01494 // Canonicalize all index into rhs, -> shuffle rhs, undef 01495 bool AllLHS = true, AllRHS = true; 01496 bool N2Undef = N2.getOpcode() == ISD::UNDEF; 01497 for (unsigned i = 0; i != NElts; ++i) { 01498 if (MaskVec[i] >= (int)NElts) { 01499 if (N2Undef) 01500 MaskVec[i] = -1; 01501 else 01502 AllLHS = false; 01503 } else if (MaskVec[i] >= 0) { 01504 AllRHS = false; 01505 } 01506 } 01507 if (AllLHS && AllRHS) 01508 return getUNDEF(VT); 01509 if (AllLHS && !N2Undef) 01510 N2 = getUNDEF(VT); 01511 if (AllRHS) { 01512 N1 = getUNDEF(VT); 01513 commuteShuffle(N1, N2, MaskVec); 01514 } 01515 // Reset our undef status after accounting for the mask. 01516 N2Undef = N2.getOpcode() == ISD::UNDEF; 01517 // Re-check whether both sides ended up undef. 01518 if (N1.getOpcode() == ISD::UNDEF && N2Undef) 01519 return getUNDEF(VT); 01520 01521 // If Identity shuffle return that node. 01522 bool Identity = true; 01523 for (unsigned i = 0; i != NElts; ++i) { 01524 if (MaskVec[i] >= 0 && MaskVec[i] != (int)i) Identity = false; 01525 } 01526 if (Identity && NElts) 01527 return N1; 01528 01529 // Shuffling a constant splat doesn't change the result. 01530 if (N2Undef) { 01531 SDValue V = N1; 01532 01533 // Look through any bitcasts. We check that these don't change the number 01534 // (and size) of elements and just changes their types. 01535 while (V.getOpcode() == ISD::BITCAST) 01536 V = V->getOperand(0); 01537 01538 // A splat should always show up as a build vector node. 01539 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) { 01540 BitVector UndefElements; 01541 SDValue Splat = BV->getSplatValue(&UndefElements); 01542 // If this is a splat of an undef, shuffling it is also undef. 01543 if (Splat && Splat.getOpcode() == ISD::UNDEF) 01544 return getUNDEF(VT); 01545 01546 // We only have a splat which can skip shuffles if there is a splatted 01547 // value and no undef lanes rearranged by the shuffle. 01548 if (Splat && UndefElements.none()) { 01549 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the 01550 // number of elements match or the value splatted is a zero constant. 01551 if (V.getValueType().getVectorNumElements() == 01552 VT.getVectorNumElements()) 01553 return N1; 01554 if (auto *C = dyn_cast<ConstantSDNode>(Splat)) 01555 if (C->isNullValue()) 01556 return N1; 01557 } 01558 } 01559 } 01560 01561 FoldingSetNodeID ID; 01562 SDValue Ops[2] = { N1, N2 }; 01563 AddNodeIDNode(ID, ISD::VECTOR_SHUFFLE, getVTList(VT), Ops); 01564 for (unsigned i = 0; i != NElts; ++i) 01565 ID.AddInteger(MaskVec[i]); 01566 01567 void* IP = nullptr; 01568 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01569 return SDValue(E, 0); 01570 01571 // Allocate the mask array for the node out of the BumpPtrAllocator, since 01572 // SDNode doesn't have access to it. This memory will be "leaked" when 01573 // the node is deallocated, but recovered when the NodeAllocator is released. 01574 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts); 01575 memcpy(MaskAlloc, &MaskVec[0], NElts * sizeof(int)); 01576 01577 ShuffleVectorSDNode *N = 01578 new (NodeAllocator) ShuffleVectorSDNode(VT, dl.getIROrder(), 01579 dl.getDebugLoc(), N1, N2, 01580 MaskAlloc); 01581 CSEMap.InsertNode(N, IP); 01582 InsertNode(N); 01583 return SDValue(N, 0); 01584 } 01585 01586 SDValue SelectionDAG::getCommutedVectorShuffle(const ShuffleVectorSDNode &SV) { 01587 MVT VT = SV.getSimpleValueType(0); 01588 unsigned NumElems = VT.getVectorNumElements(); 01589 SmallVector<int, 8> MaskVec; 01590 01591 for (unsigned i = 0; i != NumElems; ++i) { 01592 int Idx = SV.getMaskElt(i); 01593 if (Idx >= 0) { 01594 if (Idx < (int)NumElems) 01595 Idx += NumElems; 01596 else 01597 Idx -= NumElems; 01598 } 01599 MaskVec.push_back(Idx); 01600 } 01601 01602 SDValue Op0 = SV.getOperand(0); 01603 SDValue Op1 = SV.getOperand(1); 01604 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, &MaskVec[0]); 01605 } 01606 01607 SDValue SelectionDAG::getConvertRndSat(EVT VT, SDLoc dl, 01608 SDValue Val, SDValue DTy, 01609 SDValue STy, SDValue Rnd, SDValue Sat, 01610 ISD::CvtCode Code) { 01611 // If the src and dest types are the same and the conversion is between 01612 // integer types of the same sign or two floats, no conversion is necessary. 01613 if (DTy == STy && 01614 (Code == ISD::CVT_UU || Code == ISD::CVT_SS || Code == ISD::CVT_FF)) 01615 return Val; 01616 01617 FoldingSetNodeID ID; 01618 SDValue Ops[] = { Val, DTy, STy, Rnd, Sat }; 01619 AddNodeIDNode(ID, ISD::CONVERT_RNDSAT, getVTList(VT), Ops); 01620 void* IP = nullptr; 01621 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01622 return SDValue(E, 0); 01623 01624 CvtRndSatSDNode *N = new (NodeAllocator) CvtRndSatSDNode(VT, dl.getIROrder(), 01625 dl.getDebugLoc(), 01626 Ops, Code); 01627 CSEMap.InsertNode(N, IP); 01628 InsertNode(N); 01629 return SDValue(N, 0); 01630 } 01631 01632 SDValue SelectionDAG::getRegister(unsigned RegNo, EVT VT) { 01633 FoldingSetNodeID ID; 01634 AddNodeIDNode(ID, ISD::Register, getVTList(VT), None); 01635 ID.AddInteger(RegNo); 01636 void *IP = nullptr; 01637 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01638 return SDValue(E, 0); 01639 01640 SDNode *N = new (NodeAllocator) RegisterSDNode(RegNo, VT); 01641 CSEMap.InsertNode(N, IP); 01642 InsertNode(N); 01643 return SDValue(N, 0); 01644 } 01645 01646 SDValue SelectionDAG::getRegisterMask(const uint32_t *RegMask) { 01647 FoldingSetNodeID ID; 01648 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), None); 01649 ID.AddPointer(RegMask); 01650 void *IP = nullptr; 01651 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01652 return SDValue(E, 0); 01653 01654 SDNode *N = new (NodeAllocator) RegisterMaskSDNode(RegMask); 01655 CSEMap.InsertNode(N, IP); 01656 InsertNode(N); 01657 return SDValue(N, 0); 01658 } 01659 01660 SDValue SelectionDAG::getEHLabel(SDLoc dl, SDValue Root, MCSymbol *Label) { 01661 FoldingSetNodeID ID; 01662 SDValue Ops[] = { Root }; 01663 AddNodeIDNode(ID, ISD::EH_LABEL, getVTList(MVT::Other), Ops); 01664 ID.AddPointer(Label); 01665 void *IP = nullptr; 01666 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01667 return SDValue(E, 0); 01668 01669 SDNode *N = new (NodeAllocator) EHLabelSDNode(dl.getIROrder(), 01670 dl.getDebugLoc(), Root, Label); 01671 CSEMap.InsertNode(N, IP); 01672 InsertNode(N); 01673 return SDValue(N, 0); 01674 } 01675 01676 01677 SDValue SelectionDAG::getBlockAddress(const BlockAddress *BA, EVT VT, 01678 int64_t Offset, 01679 bool isTarget, 01680 unsigned char TargetFlags) { 01681 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress; 01682 01683 FoldingSetNodeID ID; 01684 AddNodeIDNode(ID, Opc, getVTList(VT), None); 01685 ID.AddPointer(BA); 01686 ID.AddInteger(Offset); 01687 ID.AddInteger(TargetFlags); 01688 void *IP = nullptr; 01689 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01690 return SDValue(E, 0); 01691 01692 SDNode *N = new (NodeAllocator) BlockAddressSDNode(Opc, VT, BA, Offset, 01693 TargetFlags); 01694 CSEMap.InsertNode(N, IP); 01695 InsertNode(N); 01696 return SDValue(N, 0); 01697 } 01698 01699 SDValue SelectionDAG::getSrcValue(const Value *V) { 01700 assert((!V || V->getType()->isPointerTy()) && 01701 "SrcValue is not a pointer?"); 01702 01703 FoldingSetNodeID ID; 01704 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), None); 01705 ID.AddPointer(V); 01706 01707 void *IP = nullptr; 01708 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01709 return SDValue(E, 0); 01710 01711 SDNode *N = new (NodeAllocator) SrcValueSDNode(V); 01712 CSEMap.InsertNode(N, IP); 01713 InsertNode(N); 01714 return SDValue(N, 0); 01715 } 01716 01717 /// getMDNode - Return an MDNodeSDNode which holds an MDNode. 01718 SDValue SelectionDAG::getMDNode(const MDNode *MD) { 01719 FoldingSetNodeID ID; 01720 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), None); 01721 ID.AddPointer(MD); 01722 01723 void *IP = nullptr; 01724 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01725 return SDValue(E, 0); 01726 01727 SDNode *N = new (NodeAllocator) MDNodeSDNode(MD); 01728 CSEMap.InsertNode(N, IP); 01729 InsertNode(N); 01730 return SDValue(N, 0); 01731 } 01732 01733 /// getAddrSpaceCast - Return an AddrSpaceCastSDNode. 01734 SDValue SelectionDAG::getAddrSpaceCast(SDLoc dl, EVT VT, SDValue Ptr, 01735 unsigned SrcAS, unsigned DestAS) { 01736 SDValue Ops[] = {Ptr}; 01737 FoldingSetNodeID ID; 01738 AddNodeIDNode(ID, ISD::ADDRSPACECAST, getVTList(VT), Ops); 01739 ID.AddInteger(SrcAS); 01740 ID.AddInteger(DestAS); 01741 01742 void *IP = nullptr; 01743 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 01744 return SDValue(E, 0); 01745 01746 SDNode *N = new (NodeAllocator) AddrSpaceCastSDNode(dl.getIROrder(), 01747 dl.getDebugLoc(), 01748 VT, Ptr, SrcAS, DestAS); 01749 CSEMap.InsertNode(N, IP); 01750 InsertNode(N); 01751 return SDValue(N, 0); 01752 } 01753 01754 /// getShiftAmountOperand - Return the specified value casted to 01755 /// the target's desired shift amount type. 01756 SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) { 01757 EVT OpTy = Op.getValueType(); 01758 EVT ShTy = 01759 TM.getSubtargetImpl()->getTargetLowering()->getShiftAmountTy(LHSTy); 01760 if (OpTy == ShTy || OpTy.isVector()) return Op; 01761 01762 ISD::NodeType Opcode = OpTy.bitsGT(ShTy) ? ISD::TRUNCATE : ISD::ZERO_EXTEND; 01763 return getNode(Opcode, SDLoc(Op), ShTy, Op); 01764 } 01765 01766 /// CreateStackTemporary - Create a stack temporary, suitable for holding the 01767 /// specified value type. 01768 SDValue SelectionDAG::CreateStackTemporary(EVT VT, unsigned minAlign) { 01769 MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo(); 01770 unsigned ByteSize = VT.getStoreSize(); 01771 Type *Ty = VT.getTypeForEVT(*getContext()); 01772 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 01773 unsigned StackAlign = 01774 std::max((unsigned)TLI->getDataLayout()->getPrefTypeAlignment(Ty), minAlign); 01775 01776 int FrameIdx = FrameInfo->CreateStackObject(ByteSize, StackAlign, false); 01777 return getFrameIndex(FrameIdx, TLI->getPointerTy()); 01778 } 01779 01780 /// CreateStackTemporary - Create a stack temporary suitable for holding 01781 /// either of the specified value types. 01782 SDValue SelectionDAG::CreateStackTemporary(EVT VT1, EVT VT2) { 01783 unsigned Bytes = std::max(VT1.getStoreSizeInBits(), 01784 VT2.getStoreSizeInBits())/8; 01785 Type *Ty1 = VT1.getTypeForEVT(*getContext()); 01786 Type *Ty2 = VT2.getTypeForEVT(*getContext()); 01787 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 01788 const DataLayout *TD = TLI->getDataLayout(); 01789 unsigned Align = std::max(TD->getPrefTypeAlignment(Ty1), 01790 TD->getPrefTypeAlignment(Ty2)); 01791 01792 MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo(); 01793 int FrameIdx = FrameInfo->CreateStackObject(Bytes, Align, false); 01794 return getFrameIndex(FrameIdx, TLI->getPointerTy()); 01795 } 01796 01797 SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1, 01798 SDValue N2, ISD::CondCode Cond, SDLoc dl) { 01799 // These setcc operations always fold. 01800 switch (Cond) { 01801 default: break; 01802 case ISD::SETFALSE: 01803 case ISD::SETFALSE2: return getConstant(0, VT); 01804 case ISD::SETTRUE: 01805 case ISD::SETTRUE2: { 01806 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 01807 TargetLowering::BooleanContent Cnt = 01808 TLI->getBooleanContents(N1->getValueType(0)); 01809 return getConstant( 01810 Cnt == TargetLowering::ZeroOrNegativeOneBooleanContent ? -1ULL : 1, VT); 01811 } 01812 01813 case ISD::SETOEQ: 01814 case ISD::SETOGT: 01815 case ISD::SETOGE: 01816 case ISD::SETOLT: 01817 case ISD::SETOLE: 01818 case ISD::SETONE: 01819 case ISD::SETO: 01820 case ISD::SETUO: 01821 case ISD::SETUEQ: 01822 case ISD::SETUNE: 01823 assert(!N1.getValueType().isInteger() && "Illegal setcc for integer!"); 01824 break; 01825 } 01826 01827 if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.getNode())) { 01828 const APInt &C2 = N2C->getAPIntValue(); 01829 if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) { 01830 const APInt &C1 = N1C->getAPIntValue(); 01831 01832 switch (Cond) { 01833 default: llvm_unreachable("Unknown integer setcc!"); 01834 case ISD::SETEQ: return getConstant(C1 == C2, VT); 01835 case ISD::SETNE: return getConstant(C1 != C2, VT); 01836 case ISD::SETULT: return getConstant(C1.ult(C2), VT); 01837 case ISD::SETUGT: return getConstant(C1.ugt(C2), VT); 01838 case ISD::SETULE: return getConstant(C1.ule(C2), VT); 01839 case ISD::SETUGE: return getConstant(C1.uge(C2), VT); 01840 case ISD::SETLT: return getConstant(C1.slt(C2), VT); 01841 case ISD::SETGT: return getConstant(C1.sgt(C2), VT); 01842 case ISD::SETLE: return getConstant(C1.sle(C2), VT); 01843 case ISD::SETGE: return getConstant(C1.sge(C2), VT); 01844 } 01845 } 01846 } 01847 if (ConstantFPSDNode *N1C = dyn_cast<ConstantFPSDNode>(N1.getNode())) { 01848 if (ConstantFPSDNode *N2C = dyn_cast<ConstantFPSDNode>(N2.getNode())) { 01849 APFloat::cmpResult R = N1C->getValueAPF().compare(N2C->getValueAPF()); 01850 switch (Cond) { 01851 default: break; 01852 case ISD::SETEQ: if (R==APFloat::cmpUnordered) 01853 return getUNDEF(VT); 01854 // fall through 01855 case ISD::SETOEQ: return getConstant(R==APFloat::cmpEqual, VT); 01856 case ISD::SETNE: if (R==APFloat::cmpUnordered) 01857 return getUNDEF(VT); 01858 // fall through 01859 case ISD::SETONE: return getConstant(R==APFloat::cmpGreaterThan || 01860 R==APFloat::cmpLessThan, VT); 01861 case ISD::SETLT: if (R==APFloat::cmpUnordered) 01862 return getUNDEF(VT); 01863 // fall through 01864 case ISD::SETOLT: return getConstant(R==APFloat::cmpLessThan, VT); 01865 case ISD::SETGT: if (R==APFloat::cmpUnordered) 01866 return getUNDEF(VT); 01867 // fall through 01868 case ISD::SETOGT: return getConstant(R==APFloat::cmpGreaterThan, VT); 01869 case ISD::SETLE: if (R==APFloat::cmpUnordered) 01870 return getUNDEF(VT); 01871 // fall through 01872 case ISD::SETOLE: return getConstant(R==APFloat::cmpLessThan || 01873 R==APFloat::cmpEqual, VT); 01874 case ISD::SETGE: if (R==APFloat::cmpUnordered) 01875 return getUNDEF(VT); 01876 // fall through 01877 case ISD::SETOGE: return getConstant(R==APFloat::cmpGreaterThan || 01878 R==APFloat::cmpEqual, VT); 01879 case ISD::SETO: return getConstant(R!=APFloat::cmpUnordered, VT); 01880 case ISD::SETUO: return getConstant(R==APFloat::cmpUnordered, VT); 01881 case ISD::SETUEQ: return getConstant(R==APFloat::cmpUnordered || 01882 R==APFloat::cmpEqual, VT); 01883 case ISD::SETUNE: return getConstant(R!=APFloat::cmpEqual, VT); 01884 case ISD::SETULT: return getConstant(R==APFloat::cmpUnordered || 01885 R==APFloat::cmpLessThan, VT); 01886 case ISD::SETUGT: return getConstant(R==APFloat::cmpGreaterThan || 01887 R==APFloat::cmpUnordered, VT); 01888 case ISD::SETULE: return getConstant(R!=APFloat::cmpGreaterThan, VT); 01889 case ISD::SETUGE: return getConstant(R!=APFloat::cmpLessThan, VT); 01890 } 01891 } else { 01892 // Ensure that the constant occurs on the RHS. 01893 ISD::CondCode SwappedCond = ISD::getSetCCSwappedOperands(Cond); 01894 MVT CompVT = N1.getValueType().getSimpleVT(); 01895 if (!TM.getSubtargetImpl()->getTargetLowering()->isCondCodeLegal( 01896 SwappedCond, CompVT)) 01897 return SDValue(); 01898 01899 return getSetCC(dl, VT, N2, N1, SwappedCond); 01900 } 01901 } 01902 01903 // Could not fold it. 01904 return SDValue(); 01905 } 01906 01907 /// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We 01908 /// use this predicate to simplify operations downstream. 01909 bool SelectionDAG::SignBitIsZero(SDValue Op, unsigned Depth) const { 01910 // This predicate is not safe for vector operations. 01911 if (Op.getValueType().isVector()) 01912 return false; 01913 01914 unsigned BitWidth = Op.getValueType().getScalarType().getSizeInBits(); 01915 return MaskedValueIsZero(Op, APInt::getSignBit(BitWidth), Depth); 01916 } 01917 01918 /// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use 01919 /// this predicate to simplify operations downstream. Mask is known to be zero 01920 /// for bits that V cannot have. 01921 bool SelectionDAG::MaskedValueIsZero(SDValue Op, const APInt &Mask, 01922 unsigned Depth) const { 01923 APInt KnownZero, KnownOne; 01924 computeKnownBits(Op, KnownZero, KnownOne, Depth); 01925 return (KnownZero & Mask) == Mask; 01926 } 01927 01928 /// Determine which bits of Op are known to be either zero or one and return 01929 /// them in the KnownZero/KnownOne bitsets. 01930 void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero, 01931 APInt &KnownOne, unsigned Depth) const { 01932 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 01933 unsigned BitWidth = Op.getValueType().getScalarType().getSizeInBits(); 01934 01935 KnownZero = KnownOne = APInt(BitWidth, 0); // Don't know anything. 01936 if (Depth == 6) 01937 return; // Limit search depth. 01938 01939 APInt KnownZero2, KnownOne2; 01940 01941 switch (Op.getOpcode()) { 01942 case ISD::Constant: 01943 // We know all of the bits for a constant! 01944 KnownOne = cast<ConstantSDNode>(Op)->getAPIntValue(); 01945 KnownZero = ~KnownOne; 01946 break; 01947 case ISD::AND: 01948 // If either the LHS or the RHS are Zero, the result is zero. 01949 computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1); 01950 computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); 01951 01952 // Output known-1 bits are only known if set in both the LHS & RHS. 01953 KnownOne &= KnownOne2; 01954 // Output known-0 are known to be clear if zero in either the LHS | RHS. 01955 KnownZero |= KnownZero2; 01956 break; 01957 case ISD::OR: 01958 computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1); 01959 computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); 01960 01961 // Output known-0 bits are only known if clear in both the LHS & RHS. 01962 KnownZero &= KnownZero2; 01963 // Output known-1 are known to be set if set in either the LHS | RHS. 01964 KnownOne |= KnownOne2; 01965 break; 01966 case ISD::XOR: { 01967 computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1); 01968 computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); 01969 01970 // Output known-0 bits are known if clear or set in both the LHS & RHS. 01971 APInt KnownZeroOut = (KnownZero & KnownZero2) | (KnownOne & KnownOne2); 01972 // Output known-1 are known to be set if set in only one of the LHS, RHS. 01973 KnownOne = (KnownZero & KnownOne2) | (KnownOne & KnownZero2); 01974 KnownZero = KnownZeroOut; 01975 break; 01976 } 01977 case ISD::MUL: { 01978 computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1); 01979 computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); 01980 01981 // If low bits are zero in either operand, output low known-0 bits. 01982 // Also compute a conserative estimate for high known-0 bits. 01983 // More trickiness is possible, but this is sufficient for the 01984 // interesting case of alignment computation. 01985 KnownOne.clearAllBits(); 01986 unsigned TrailZ = KnownZero.countTrailingOnes() + 01987 KnownZero2.countTrailingOnes(); 01988 unsigned LeadZ = std::max(KnownZero.countLeadingOnes() + 01989 KnownZero2.countLeadingOnes(), 01990 BitWidth) - BitWidth; 01991 01992 TrailZ = std::min(TrailZ, BitWidth); 01993 LeadZ = std::min(LeadZ, BitWidth); 01994 KnownZero = APInt::getLowBitsSet(BitWidth, TrailZ) | 01995 APInt::getHighBitsSet(BitWidth, LeadZ); 01996 break; 01997 } 01998 case ISD::UDIV: { 01999 // For the purposes of computing leading zeros we can conservatively 02000 // treat a udiv as a logical right shift by the power of 2 known to 02001 // be less than the denominator. 02002 computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); 02003 unsigned LeadZ = KnownZero2.countLeadingOnes(); 02004 02005 KnownOne2.clearAllBits(); 02006 KnownZero2.clearAllBits(); 02007 computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1); 02008 unsigned RHSUnknownLeadingOnes = KnownOne2.countLeadingZeros(); 02009 if (RHSUnknownLeadingOnes != BitWidth) 02010 LeadZ = std::min(BitWidth, 02011 LeadZ + BitWidth - RHSUnknownLeadingOnes - 1); 02012 02013 KnownZero = APInt::getHighBitsSet(BitWidth, LeadZ); 02014 break; 02015 } 02016 case ISD::SELECT: 02017 computeKnownBits(Op.getOperand(2), KnownZero, KnownOne, Depth+1); 02018 computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1); 02019 02020 // Only known if known in both the LHS and RHS. 02021 KnownOne &= KnownOne2; 02022 KnownZero &= KnownZero2; 02023 break; 02024 case ISD::SELECT_CC: 02025 computeKnownBits(Op.getOperand(3), KnownZero, KnownOne, Depth+1); 02026 computeKnownBits(Op.getOperand(2), KnownZero2, KnownOne2, Depth+1); 02027 02028 // Only known if known in both the LHS and RHS. 02029 KnownOne &= KnownOne2; 02030 KnownZero &= KnownZero2; 02031 break; 02032 case ISD::SADDO: 02033 case ISD::UADDO: 02034 case ISD::SSUBO: 02035 case ISD::USUBO: 02036 case ISD::SMULO: 02037 case ISD::UMULO: 02038 if (Op.getResNo() != 1) 02039 break; 02040 // The boolean result conforms to getBooleanContents. 02041 // If we know the result of a setcc has the top bits zero, use this info. 02042 // We know that we have an integer-based boolean since these operations 02043 // are only available for integer. 02044 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) == 02045 TargetLowering::ZeroOrOneBooleanContent && 02046 BitWidth > 1) 02047 KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - 1); 02048 break; 02049 case ISD::SETCC: 02050 // If we know the result of a setcc has the top bits zero, use this info. 02051 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) == 02052 TargetLowering::ZeroOrOneBooleanContent && 02053 BitWidth > 1) 02054 KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - 1); 02055 break; 02056 case ISD::SHL: 02057 // (shl X, C1) & C2 == 0 iff (X & C2 >>u C1) == 0 02058 if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02059 unsigned ShAmt = SA->getZExtValue(); 02060 02061 // If the shift count is an invalid immediate, don't do anything. 02062 if (ShAmt >= BitWidth) 02063 break; 02064 02065 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02066 KnownZero <<= ShAmt; 02067 KnownOne <<= ShAmt; 02068 // low bits known zero. 02069 KnownZero |= APInt::getLowBitsSet(BitWidth, ShAmt); 02070 } 02071 break; 02072 case ISD::SRL: 02073 // (ushr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0 02074 if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02075 unsigned ShAmt = SA->getZExtValue(); 02076 02077 // If the shift count is an invalid immediate, don't do anything. 02078 if (ShAmt >= BitWidth) 02079 break; 02080 02081 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02082 KnownZero = KnownZero.lshr(ShAmt); 02083 KnownOne = KnownOne.lshr(ShAmt); 02084 02085 APInt HighBits = APInt::getHighBitsSet(BitWidth, ShAmt); 02086 KnownZero |= HighBits; // High bits known zero. 02087 } 02088 break; 02089 case ISD::SRA: 02090 if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02091 unsigned ShAmt = SA->getZExtValue(); 02092 02093 // If the shift count is an invalid immediate, don't do anything. 02094 if (ShAmt >= BitWidth) 02095 break; 02096 02097 // If any of the demanded bits are produced by the sign extension, we also 02098 // demand the input sign bit. 02099 APInt HighBits = APInt::getHighBitsSet(BitWidth, ShAmt); 02100 02101 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02102 KnownZero = KnownZero.lshr(ShAmt); 02103 KnownOne = KnownOne.lshr(ShAmt); 02104 02105 // Handle the sign bits. 02106 APInt SignBit = APInt::getSignBit(BitWidth); 02107 SignBit = SignBit.lshr(ShAmt); // Adjust to where it is now in the mask. 02108 02109 if (KnownZero.intersects(SignBit)) { 02110 KnownZero |= HighBits; // New bits are known zero. 02111 } else if (KnownOne.intersects(SignBit)) { 02112 KnownOne |= HighBits; // New bits are known one. 02113 } 02114 } 02115 break; 02116 case ISD::SIGN_EXTEND_INREG: { 02117 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT(); 02118 unsigned EBits = EVT.getScalarType().getSizeInBits(); 02119 02120 // Sign extension. Compute the demanded bits in the result that are not 02121 // present in the input. 02122 APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - EBits); 02123 02124 APInt InSignBit = APInt::getSignBit(EBits); 02125 APInt InputDemandedBits = APInt::getLowBitsSet(BitWidth, EBits); 02126 02127 // If the sign extended bits are demanded, we know that the sign 02128 // bit is demanded. 02129 InSignBit = InSignBit.zext(BitWidth); 02130 if (NewBits.getBoolValue()) 02131 InputDemandedBits |= InSignBit; 02132 02133 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02134 KnownOne &= InputDemandedBits; 02135 KnownZero &= InputDemandedBits; 02136 02137 // If the sign bit of the input is known set or clear, then we know the 02138 // top bits of the result. 02139 if (KnownZero.intersects(InSignBit)) { // Input sign bit known clear 02140 KnownZero |= NewBits; 02141 KnownOne &= ~NewBits; 02142 } else if (KnownOne.intersects(InSignBit)) { // Input sign bit known set 02143 KnownOne |= NewBits; 02144 KnownZero &= ~NewBits; 02145 } else { // Input sign bit unknown 02146 KnownZero &= ~NewBits; 02147 KnownOne &= ~NewBits; 02148 } 02149 break; 02150 } 02151 case ISD::CTTZ: 02152 case ISD::CTTZ_ZERO_UNDEF: 02153 case ISD::CTLZ: 02154 case ISD::CTLZ_ZERO_UNDEF: 02155 case ISD::CTPOP: { 02156 unsigned LowBits = Log2_32(BitWidth)+1; 02157 KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - LowBits); 02158 KnownOne.clearAllBits(); 02159 break; 02160 } 02161 case ISD::LOAD: { 02162 LoadSDNode *LD = cast<LoadSDNode>(Op); 02163 // If this is a ZEXTLoad and we are looking at the loaded value. 02164 if (ISD::isZEXTLoad(Op.getNode()) && Op.getResNo() == 0) { 02165 EVT VT = LD->getMemoryVT(); 02166 unsigned MemBits = VT.getScalarType().getSizeInBits(); 02167 KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - MemBits); 02168 } else if (const MDNode *Ranges = LD->getRanges()) { 02169 computeKnownBitsFromRangeMetadata(*Ranges, KnownZero); 02170 } 02171 break; 02172 } 02173 case ISD::ZERO_EXTEND: { 02174 EVT InVT = Op.getOperand(0).getValueType(); 02175 unsigned InBits = InVT.getScalarType().getSizeInBits(); 02176 APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - InBits); 02177 KnownZero = KnownZero.trunc(InBits); 02178 KnownOne = KnownOne.trunc(InBits); 02179 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02180 KnownZero = KnownZero.zext(BitWidth); 02181 KnownOne = KnownOne.zext(BitWidth); 02182 KnownZero |= NewBits; 02183 break; 02184 } 02185 case ISD::SIGN_EXTEND: { 02186 EVT InVT = Op.getOperand(0).getValueType(); 02187 unsigned InBits = InVT.getScalarType().getSizeInBits(); 02188 APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - InBits); 02189 02190 KnownZero = KnownZero.trunc(InBits); 02191 KnownOne = KnownOne.trunc(InBits); 02192 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02193 02194 // Note if the sign bit is known to be zero or one. 02195 bool SignBitKnownZero = KnownZero.isNegative(); 02196 bool SignBitKnownOne = KnownOne.isNegative(); 02197 02198 KnownZero = KnownZero.zext(BitWidth); 02199 KnownOne = KnownOne.zext(BitWidth); 02200 02201 // If the sign bit is known zero or one, the top bits match. 02202 if (SignBitKnownZero) 02203 KnownZero |= NewBits; 02204 else if (SignBitKnownOne) 02205 KnownOne |= NewBits; 02206 break; 02207 } 02208 case ISD::ANY_EXTEND: { 02209 EVT InVT = Op.getOperand(0).getValueType(); 02210 unsigned InBits = InVT.getScalarType().getSizeInBits(); 02211 KnownZero = KnownZero.trunc(InBits); 02212 KnownOne = KnownOne.trunc(InBits); 02213 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02214 KnownZero = KnownZero.zext(BitWidth); 02215 KnownOne = KnownOne.zext(BitWidth); 02216 break; 02217 } 02218 case ISD::TRUNCATE: { 02219 EVT InVT = Op.getOperand(0).getValueType(); 02220 unsigned InBits = InVT.getScalarType().getSizeInBits(); 02221 KnownZero = KnownZero.zext(InBits); 02222 KnownOne = KnownOne.zext(InBits); 02223 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02224 KnownZero = KnownZero.trunc(BitWidth); 02225 KnownOne = KnownOne.trunc(BitWidth); 02226 break; 02227 } 02228 case ISD::AssertZext: { 02229 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT(); 02230 APInt InMask = APInt::getLowBitsSet(BitWidth, VT.getSizeInBits()); 02231 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02232 KnownZero |= (~InMask); 02233 KnownOne &= (~KnownZero); 02234 break; 02235 } 02236 case ISD::FGETSIGN: 02237 // All bits are zero except the low bit. 02238 KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - 1); 02239 break; 02240 02241 case ISD::SUB: { 02242 if (ConstantSDNode *CLHS = dyn_cast<ConstantSDNode>(Op.getOperand(0))) { 02243 // We know that the top bits of C-X are clear if X contains less bits 02244 // than C (i.e. no wrap-around can happen). For example, 20-X is 02245 // positive if we can prove that X is >= 0 and < 16. 02246 if (CLHS->getAPIntValue().isNonNegative()) { 02247 unsigned NLZ = (CLHS->getAPIntValue()+1).countLeadingZeros(); 02248 // NLZ can't be BitWidth with no sign bit 02249 APInt MaskV = APInt::getHighBitsSet(BitWidth, NLZ+1); 02250 computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1); 02251 02252 // If all of the MaskV bits are known to be zero, then we know the 02253 // output top bits are zero, because we now know that the output is 02254 // from [0-C]. 02255 if ((KnownZero2 & MaskV) == MaskV) { 02256 unsigned NLZ2 = CLHS->getAPIntValue().countLeadingZeros(); 02257 // Top bits known zero. 02258 KnownZero = APInt::getHighBitsSet(BitWidth, NLZ2); 02259 } 02260 } 02261 } 02262 } 02263 // fall through 02264 case ISD::ADD: 02265 case ISD::ADDE: { 02266 // Output known-0 bits are known if clear or set in both the low clear bits 02267 // common to both LHS & RHS. For example, 8+(X<<3) is known to have the 02268 // low 3 bits clear. 02269 computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); 02270 unsigned KnownZeroOut = KnownZero2.countTrailingOnes(); 02271 02272 computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1); 02273 KnownZeroOut = std::min(KnownZeroOut, 02274 KnownZero2.countTrailingOnes()); 02275 02276 if (Op.getOpcode() == ISD::ADD) { 02277 KnownZero |= APInt::getLowBitsSet(BitWidth, KnownZeroOut); 02278 break; 02279 } 02280 02281 // With ADDE, a carry bit may be added in, so we can only use this 02282 // information if we know (at least) that the low two bits are clear. We 02283 // then return to the caller that the low bit is unknown but that other bits 02284 // are known zero. 02285 if (KnownZeroOut >= 2) // ADDE 02286 KnownZero |= APInt::getBitsSet(BitWidth, 1, KnownZeroOut); 02287 break; 02288 } 02289 case ISD::SREM: 02290 if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02291 const APInt &RA = Rem->getAPIntValue().abs(); 02292 if (RA.isPowerOf2()) { 02293 APInt LowBits = RA - 1; 02294 computeKnownBits(Op.getOperand(0), KnownZero2,KnownOne2,Depth+1); 02295 02296 // The low bits of the first operand are unchanged by the srem. 02297 KnownZero = KnownZero2 & LowBits; 02298 KnownOne = KnownOne2 & LowBits; 02299 02300 // If the first operand is non-negative or has all low bits zero, then 02301 // the upper bits are all zero. 02302 if (KnownZero2[BitWidth-1] || ((KnownZero2 & LowBits) == LowBits)) 02303 KnownZero |= ~LowBits; 02304 02305 // If the first operand is negative and not all low bits are zero, then 02306 // the upper bits are all one. 02307 if (KnownOne2[BitWidth-1] && ((KnownOne2 & LowBits) != 0)) 02308 KnownOne |= ~LowBits; 02309 assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?"); 02310 } 02311 } 02312 break; 02313 case ISD::UREM: { 02314 if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02315 const APInt &RA = Rem->getAPIntValue(); 02316 if (RA.isPowerOf2()) { 02317 APInt LowBits = (RA - 1); 02318 computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth + 1); 02319 02320 // The upper bits are all zero, the lower ones are unchanged. 02321 KnownZero = KnownZero2 | ~LowBits; 02322 KnownOne = KnownOne2 & LowBits; 02323 break; 02324 } 02325 } 02326 02327 // Since the result is less than or equal to either operand, any leading 02328 // zero bits in either operand must also exist in the result. 02329 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02330 computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1); 02331 02332 uint32_t Leaders = std::max(KnownZero.countLeadingOnes(), 02333 KnownZero2.countLeadingOnes()); 02334 KnownOne.clearAllBits(); 02335 KnownZero = APInt::getHighBitsSet(BitWidth, Leaders); 02336 break; 02337 } 02338 case ISD::FrameIndex: 02339 case ISD::TargetFrameIndex: 02340 if (unsigned Align = InferPtrAlignment(Op)) { 02341 // The low bits are known zero if the pointer is aligned. 02342 KnownZero = APInt::getLowBitsSet(BitWidth, Log2_32(Align)); 02343 break; 02344 } 02345 break; 02346 02347 default: 02348 if (Op.getOpcode() < ISD::BUILTIN_OP_END) 02349 break; 02350 // Fallthrough 02351 case ISD::INTRINSIC_WO_CHAIN: 02352 case ISD::INTRINSIC_W_CHAIN: 02353 case ISD::INTRINSIC_VOID: 02354 // Allow the target to implement this method for its nodes. 02355 TLI->computeKnownBitsForTargetNode(Op, KnownZero, KnownOne, *this, Depth); 02356 break; 02357 } 02358 02359 assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); 02360 } 02361 02362 /// ComputeNumSignBits - Return the number of times the sign bit of the 02363 /// register is replicated into the other bits. We know that at least 1 bit 02364 /// is always equal to the sign bit (itself), but other cases can give us 02365 /// information. For example, immediately after an "SRA X, 2", we know that 02366 /// the top 3 bits are all equal to each other, so we return 3. 02367 unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, unsigned Depth) const{ 02368 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 02369 EVT VT = Op.getValueType(); 02370 assert(VT.isInteger() && "Invalid VT!"); 02371 unsigned VTBits = VT.getScalarType().getSizeInBits(); 02372 unsigned Tmp, Tmp2; 02373 unsigned FirstAnswer = 1; 02374 02375 if (Depth == 6) 02376 return 1; // Limit search depth. 02377 02378 switch (Op.getOpcode()) { 02379 default: break; 02380 case ISD::AssertSext: 02381 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits(); 02382 return VTBits-Tmp+1; 02383 case ISD::AssertZext: 02384 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits(); 02385 return VTBits-Tmp; 02386 02387 case ISD::Constant: { 02388 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue(); 02389 return Val.getNumSignBits(); 02390 } 02391 02392 case ISD::SIGN_EXTEND: 02393 Tmp = 02394 VTBits-Op.getOperand(0).getValueType().getScalarType().getSizeInBits(); 02395 return ComputeNumSignBits(Op.getOperand(0), Depth+1) + Tmp; 02396 02397 case ISD::SIGN_EXTEND_INREG: 02398 // Max of the input and what this extends. 02399 Tmp = 02400 cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarType().getSizeInBits(); 02401 Tmp = VTBits-Tmp+1; 02402 02403 Tmp2 = ComputeNumSignBits(Op.getOperand(0), Depth+1); 02404 return std::max(Tmp, Tmp2); 02405 02406 case ISD::SRA: 02407 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1); 02408 // SRA X, C -> adds C sign bits. 02409 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02410 Tmp += C->getZExtValue(); 02411 if (Tmp > VTBits) Tmp = VTBits; 02412 } 02413 return Tmp; 02414 case ISD::SHL: 02415 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02416 // shl destroys sign bits. 02417 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1); 02418 if (C->getZExtValue() >= VTBits || // Bad shift. 02419 C->getZExtValue() >= Tmp) break; // Shifted all sign bits out. 02420 return Tmp - C->getZExtValue(); 02421 } 02422 break; 02423 case ISD::AND: 02424 case ISD::OR: 02425 case ISD::XOR: // NOT is handled here. 02426 // Logical binary ops preserve the number of sign bits at the worst. 02427 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1); 02428 if (Tmp != 1) { 02429 Tmp2 = ComputeNumSignBits(Op.getOperand(1), Depth+1); 02430 FirstAnswer = std::min(Tmp, Tmp2); 02431 // We computed what we know about the sign bits as our first 02432 // answer. Now proceed to the generic code that uses 02433 // computeKnownBits, and pick whichever answer is better. 02434 } 02435 break; 02436 02437 case ISD::SELECT: 02438 Tmp = ComputeNumSignBits(Op.getOperand(1), Depth+1); 02439 if (Tmp == 1) return 1; // Early out. 02440 Tmp2 = ComputeNumSignBits(Op.getOperand(2), Depth+1); 02441 return std::min(Tmp, Tmp2); 02442 02443 case ISD::SADDO: 02444 case ISD::UADDO: 02445 case ISD::SSUBO: 02446 case ISD::USUBO: 02447 case ISD::SMULO: 02448 case ISD::UMULO: 02449 if (Op.getResNo() != 1) 02450 break; 02451 // The boolean result conforms to getBooleanContents. Fall through. 02452 // If setcc returns 0/-1, all bits are sign bits. 02453 // We know that we have an integer-based boolean since these operations 02454 // are only available for integer. 02455 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) == 02456 TargetLowering::ZeroOrNegativeOneBooleanContent) 02457 return VTBits; 02458 break; 02459 case ISD::SETCC: 02460 // If setcc returns 0/-1, all bits are sign bits. 02461 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) == 02462 TargetLowering::ZeroOrNegativeOneBooleanContent) 02463 return VTBits; 02464 break; 02465 case ISD::ROTL: 02466 case ISD::ROTR: 02467 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 02468 unsigned RotAmt = C->getZExtValue() & (VTBits-1); 02469 02470 // Handle rotate right by N like a rotate left by 32-N. 02471 if (Op.getOpcode() == ISD::ROTR) 02472 RotAmt = (VTBits-RotAmt) & (VTBits-1); 02473 02474 // If we aren't rotating out all of the known-in sign bits, return the 02475 // number that are left. This handles rotl(sext(x), 1) for example. 02476 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1); 02477 if (Tmp > RotAmt+1) return Tmp-RotAmt; 02478 } 02479 break; 02480 case ISD::ADD: 02481 // Add can have at most one carry bit. Thus we know that the output 02482 // is, at worst, one more bit than the inputs. 02483 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1); 02484 if (Tmp == 1) return 1; // Early out. 02485 02486 // Special case decrementing a value (ADD X, -1): 02487 if (ConstantSDNode *CRHS = dyn_cast<ConstantSDNode>(Op.getOperand(1))) 02488 if (CRHS->isAllOnesValue()) { 02489 APInt KnownZero, KnownOne; 02490 computeKnownBits(Op.getOperand(0), KnownZero, KnownOne, Depth+1); 02491 02492 // If the input is known to be 0 or 1, the output is 0/-1, which is all 02493 // sign bits set. 02494 if ((KnownZero | APInt(VTBits, 1)).isAllOnesValue()) 02495 return VTBits; 02496 02497 // If we are subtracting one from a positive number, there is no carry 02498 // out of the result. 02499 if (KnownZero.isNegative()) 02500 return Tmp; 02501 } 02502 02503 Tmp2 = ComputeNumSignBits(Op.getOperand(1), Depth+1); 02504 if (Tmp2 == 1) return 1; 02505 return std::min(Tmp, Tmp2)-1; 02506 02507 case ISD::SUB: 02508 Tmp2 = ComputeNumSignBits(Op.getOperand(1), Depth+1); 02509 if (Tmp2 == 1) return 1; 02510 02511 // Handle NEG. 02512 if (ConstantSDNode *CLHS = dyn_cast<ConstantSDNode>(Op.getOperand(0))) 02513 if (CLHS->isNullValue()) { 02514 APInt KnownZero, KnownOne; 02515 computeKnownBits(Op.getOperand(1), KnownZero, KnownOne, Depth+1); 02516 // If the input is known to be 0 or 1, the output is 0/-1, which is all 02517 // sign bits set. 02518 if ((KnownZero | APInt(VTBits, 1)).isAllOnesValue()) 02519 return VTBits; 02520 02521 // If the input is known to be positive (the sign bit is known clear), 02522 // the output of the NEG has the same number of sign bits as the input. 02523 if (KnownZero.isNegative()) 02524 return Tmp2; 02525 02526 // Otherwise, we treat this like a SUB. 02527 } 02528 02529 // Sub can have at most one carry bit. Thus we know that the output 02530 // is, at worst, one more bit than the inputs. 02531 Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1); 02532 if (Tmp == 1) return 1; // Early out. 02533 return std::min(Tmp, Tmp2)-1; 02534 case ISD::TRUNCATE: 02535 // FIXME: it's tricky to do anything useful for this, but it is an important 02536 // case for targets like X86. 02537 break; 02538 } 02539 02540 // If we are looking at the loaded value of the SDNode. 02541 if (Op.getResNo() == 0) { 02542 // Handle LOADX separately here. EXTLOAD case will fallthrough. 02543 if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) { 02544 unsigned ExtType = LD->getExtensionType(); 02545 switch (ExtType) { 02546 default: break; 02547 case ISD::SEXTLOAD: // '17' bits known 02548 Tmp = LD->getMemoryVT().getScalarType().getSizeInBits(); 02549 return VTBits-Tmp+1; 02550 case ISD::ZEXTLOAD: // '16' bits known 02551 Tmp = LD->getMemoryVT().getScalarType().getSizeInBits(); 02552 return VTBits-Tmp; 02553 } 02554 } 02555 } 02556 02557 // Allow the target to implement this method for its nodes. 02558 if (Op.getOpcode() >= ISD::BUILTIN_OP_END || 02559 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN || 02560 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN || 02561 Op.getOpcode() == ISD::INTRINSIC_VOID) { 02562 unsigned NumBits = TLI->ComputeNumSignBitsForTargetNode(Op, *this, Depth); 02563 if (NumBits > 1) FirstAnswer = std::max(FirstAnswer, NumBits); 02564 } 02565 02566 // Finally, if we can prove that the top bits of the result are 0's or 1's, 02567 // use this information. 02568 APInt KnownZero, KnownOne; 02569 computeKnownBits(Op, KnownZero, KnownOne, Depth); 02570 02571 APInt Mask; 02572 if (KnownZero.isNegative()) { // sign bit is 0 02573 Mask = KnownZero; 02574 } else if (KnownOne.isNegative()) { // sign bit is 1; 02575 Mask = KnownOne; 02576 } else { 02577 // Nothing known. 02578 return FirstAnswer; 02579 } 02580 02581 // Okay, we know that the sign bit in Mask is set. Use CLZ to determine 02582 // the number of identical bits in the top of the input value. 02583 Mask = ~Mask; 02584 Mask <<= Mask.getBitWidth()-VTBits; 02585 // Return # leading zeros. We use 'min' here in case Val was zero before 02586 // shifting. We don't want to return '64' as for an i32 "0". 02587 return std::max(FirstAnswer, std::min(VTBits, Mask.countLeadingZeros())); 02588 } 02589 02590 /// isBaseWithConstantOffset - Return true if the specified operand is an 02591 /// ISD::ADD with a ConstantSDNode on the right-hand side, or if it is an 02592 /// ISD::OR with a ConstantSDNode that is guaranteed to have the same 02593 /// semantics as an ADD. This handles the equivalence: 02594 /// X|Cst == X+Cst iff X&Cst = 0. 02595 bool SelectionDAG::isBaseWithConstantOffset(SDValue Op) const { 02596 if ((Op.getOpcode() != ISD::ADD && Op.getOpcode() != ISD::OR) || 02597 !isa<ConstantSDNode>(Op.getOperand(1))) 02598 return false; 02599 02600 if (Op.getOpcode() == ISD::OR && 02601 !MaskedValueIsZero(Op.getOperand(0), 02602 cast<ConstantSDNode>(Op.getOperand(1))->getAPIntValue())) 02603 return false; 02604 02605 return true; 02606 } 02607 02608 02609 bool SelectionDAG::isKnownNeverNaN(SDValue Op) const { 02610 // If we're told that NaNs won't happen, assume they won't. 02611 if (getTarget().Options.NoNaNsFPMath) 02612 return true; 02613 02614 // If the value is a constant, we can obviously see if it is a NaN or not. 02615 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op)) 02616 return !C->getValueAPF().isNaN(); 02617 02618 // TODO: Recognize more cases here. 02619 02620 return false; 02621 } 02622 02623 bool SelectionDAG::isKnownNeverZero(SDValue Op) const { 02624 // If the value is a constant, we can obviously see if it is a zero or not. 02625 if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op)) 02626 return !C->isZero(); 02627 02628 // TODO: Recognize more cases here. 02629 switch (Op.getOpcode()) { 02630 default: break; 02631 case ISD::OR: 02632 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) 02633 return !C->isNullValue(); 02634 break; 02635 } 02636 02637 return false; 02638 } 02639 02640 bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const { 02641 // Check the obvious case. 02642 if (A == B) return true; 02643 02644 // For for negative and positive zero. 02645 if (const ConstantFPSDNode *CA = dyn_cast<ConstantFPSDNode>(A)) 02646 if (const ConstantFPSDNode *CB = dyn_cast<ConstantFPSDNode>(B)) 02647 if (CA->isZero() && CB->isZero()) return true; 02648 02649 // Otherwise they may not be equal. 02650 return false; 02651 } 02652 02653 /// getNode - Gets or creates the specified node. 02654 /// 02655 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT) { 02656 FoldingSetNodeID ID; 02657 AddNodeIDNode(ID, Opcode, getVTList(VT), None); 02658 void *IP = nullptr; 02659 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 02660 return SDValue(E, 0); 02661 02662 SDNode *N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), 02663 DL.getDebugLoc(), getVTList(VT)); 02664 CSEMap.InsertNode(N, IP); 02665 02666 InsertNode(N); 02667 return SDValue(N, 0); 02668 } 02669 02670 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, 02671 EVT VT, SDValue Operand) { 02672 // Constant fold unary operations with an integer constant operand. Even 02673 // opaque constant will be folded, because the folding of unary operations 02674 // doesn't create new constants with different values. Nevertheless, the 02675 // opaque flag is preserved during folding to prevent future folding with 02676 // other constants. 02677 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Operand.getNode())) { 02678 const APInt &Val = C->getAPIntValue(); 02679 switch (Opcode) { 02680 default: break; 02681 case ISD::SIGN_EXTEND: 02682 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), VT, 02683 C->isTargetOpcode(), C->isOpaque()); 02684 case ISD::ANY_EXTEND: 02685 case ISD::ZERO_EXTEND: 02686 case ISD::TRUNCATE: 02687 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), VT, 02688 C->isTargetOpcode(), C->isOpaque()); 02689 case ISD::UINT_TO_FP: 02690 case ISD::SINT_TO_FP: { 02691 APFloat apf(EVTToAPFloatSemantics(VT), 02692 APInt::getNullValue(VT.getSizeInBits())); 02693 (void)apf.convertFromAPInt(Val, 02694 Opcode==ISD::SINT_TO_FP, 02695 APFloat::rmNearestTiesToEven); 02696 return getConstantFP(apf, VT); 02697 } 02698 case ISD::BITCAST: 02699 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32) 02700 return getConstantFP(APFloat(APFloat::IEEEsingle, Val), VT); 02701 else if (VT == MVT::f64 && C->getValueType(0) == MVT::i64) 02702 return getConstantFP(APFloat(APFloat::IEEEdouble, Val), VT); 02703 break; 02704 case ISD::BSWAP: 02705 return getConstant(Val.byteSwap(), VT, C->isTargetOpcode(), 02706 C->isOpaque()); 02707 case ISD::CTPOP: 02708 return getConstant(Val.countPopulation(), VT, C->isTargetOpcode(), 02709 C->isOpaque()); 02710 case ISD::CTLZ: 02711 case ISD::CTLZ_ZERO_UNDEF: 02712 return getConstant(Val.countLeadingZeros(), VT, C->isTargetOpcode(), 02713 C->isOpaque()); 02714 case ISD::CTTZ: 02715 case ISD::CTTZ_ZERO_UNDEF: 02716 return getConstant(Val.countTrailingZeros(), VT, C->isTargetOpcode(), 02717 C->isOpaque()); 02718 } 02719 } 02720 02721 // Constant fold unary operations with a floating point constant operand. 02722 if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Operand.getNode())) { 02723 APFloat V = C->getValueAPF(); // make copy 02724 switch (Opcode) { 02725 case ISD::FNEG: 02726 V.changeSign(); 02727 return getConstantFP(V, VT); 02728 case ISD::FABS: 02729 V.clearSign(); 02730 return getConstantFP(V, VT); 02731 case ISD::FCEIL: { 02732 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive); 02733 if (fs == APFloat::opOK || fs == APFloat::opInexact) 02734 return getConstantFP(V, VT); 02735 break; 02736 } 02737 case ISD::FTRUNC: { 02738 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero); 02739 if (fs == APFloat::opOK || fs == APFloat::opInexact) 02740 return getConstantFP(V, VT); 02741 break; 02742 } 02743 case ISD::FFLOOR: { 02744 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative); 02745 if (fs == APFloat::opOK || fs == APFloat::opInexact) 02746 return getConstantFP(V, VT); 02747 break; 02748 } 02749 case ISD::FP_EXTEND: { 02750 bool ignored; 02751 // This can return overflow, underflow, or inexact; we don't care. 02752 // FIXME need to be more flexible about rounding mode. 02753 (void)V.convert(EVTToAPFloatSemantics(VT), 02754 APFloat::rmNearestTiesToEven, &ignored); 02755 return getConstantFP(V, VT); 02756 } 02757 case ISD::FP_TO_SINT: 02758 case ISD::FP_TO_UINT: { 02759 integerPart x[2]; 02760 bool ignored; 02761 assert(integerPartWidth >= 64); 02762 // FIXME need to be more flexible about rounding mode. 02763 APFloat::opStatus s = V.convertToInteger(x, VT.getSizeInBits(), 02764 Opcode==ISD::FP_TO_SINT, 02765 APFloat::rmTowardZero, &ignored); 02766 if (s==APFloat::opInvalidOp) // inexact is OK, in fact usual 02767 break; 02768 APInt api(VT.getSizeInBits(), x); 02769 return getConstant(api, VT); 02770 } 02771 case ISD::BITCAST: 02772 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32) 02773 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), VT); 02774 else if (VT == MVT::i64 && C->getValueType(0) == MVT::f64) 02775 return getConstant(V.bitcastToAPInt().getZExtValue(), VT); 02776 break; 02777 } 02778 } 02779 02780 // Constant fold unary operations with a vector integer operand. 02781 if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(Operand.getNode())) { 02782 if (BV->isConstant()) { 02783 switch (Opcode) { 02784 default: 02785 // FIXME: Entirely reasonable to perform folding of other unary 02786 // operations here as the need arises. 02787 break; 02788 case ISD::UINT_TO_FP: 02789 case ISD::SINT_TO_FP: { 02790 SmallVector<SDValue, 8> Ops; 02791 for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) { 02792 SDValue OpN = BV->getOperand(i); 02793 // Let the above scalar folding handle the conversion of each 02794 // element. 02795 OpN = getNode(ISD::SINT_TO_FP, DL, VT.getVectorElementType(), 02796 OpN); 02797 Ops.push_back(OpN); 02798 } 02799 return getNode(ISD::BUILD_VECTOR, DL, VT, Ops); 02800 } 02801 } 02802 } 02803 } 02804 02805 unsigned OpOpcode = Operand.getNode()->getOpcode(); 02806 switch (Opcode) { 02807 case ISD::TokenFactor: 02808 case ISD::MERGE_VALUES: 02809 case ISD::CONCAT_VECTORS: 02810 return Operand; // Factor, merge or concat of one node? No need. 02811 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node"); 02812 case ISD::FP_EXTEND: 02813 assert(VT.isFloatingPoint() && 02814 Operand.getValueType().isFloatingPoint() && "Invalid FP cast!"); 02815 if (Operand.getValueType() == VT) return Operand; // noop conversion. 02816 assert((!VT.isVector() || 02817 VT.getVectorNumElements() == 02818 Operand.getValueType().getVectorNumElements()) && 02819 "Vector element count mismatch!"); 02820 if (Operand.getOpcode() == ISD::UNDEF) 02821 return getUNDEF(VT); 02822 break; 02823 case ISD::SIGN_EXTEND: 02824 assert(VT.isInteger() && Operand.getValueType().isInteger() && 02825 "Invalid SIGN_EXTEND!"); 02826 if (Operand.getValueType() == VT) return Operand; // noop extension 02827 assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) && 02828 "Invalid sext node, dst < src!"); 02829 assert((!VT.isVector() || 02830 VT.getVectorNumElements() == 02831 Operand.getValueType().getVectorNumElements()) && 02832 "Vector element count mismatch!"); 02833 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) 02834 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0)); 02835 else if (OpOpcode == ISD::UNDEF) 02836 // sext(undef) = 0, because the top bits will all be the same. 02837 return getConstant(0, VT); 02838 break; 02839 case ISD::ZERO_EXTEND: 02840 assert(VT.isInteger() && Operand.getValueType().isInteger() && 02841 "Invalid ZERO_EXTEND!"); 02842 if (Operand.getValueType() == VT) return Operand; // noop extension 02843 assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) && 02844 "Invalid zext node, dst < src!"); 02845 assert((!VT.isVector() || 02846 VT.getVectorNumElements() == 02847 Operand.getValueType().getVectorNumElements()) && 02848 "Vector element count mismatch!"); 02849 if (OpOpcode == ISD::ZERO_EXTEND) // (zext (zext x)) -> (zext x) 02850 return getNode(ISD::ZERO_EXTEND, DL, VT, 02851 Operand.getNode()->getOperand(0)); 02852 else if (OpOpcode == ISD::UNDEF) 02853 // zext(undef) = 0, because the top bits will be zero. 02854 return getConstant(0, VT); 02855 break; 02856 case ISD::ANY_EXTEND: 02857 assert(VT.isInteger() && Operand.getValueType().isInteger() && 02858 "Invalid ANY_EXTEND!"); 02859 if (Operand.getValueType() == VT) return Operand; // noop extension 02860 assert(Operand.getValueType().getScalarType().bitsLT(VT.getScalarType()) && 02861 "Invalid anyext node, dst < src!"); 02862 assert((!VT.isVector() || 02863 VT.getVectorNumElements() == 02864 Operand.getValueType().getVectorNumElements()) && 02865 "Vector element count mismatch!"); 02866 02867 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND || 02868 OpOpcode == ISD::ANY_EXTEND) 02869 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x) 02870 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0)); 02871 else if (OpOpcode == ISD::UNDEF) 02872 return getUNDEF(VT); 02873 02874 // (ext (trunx x)) -> x 02875 if (OpOpcode == ISD::TRUNCATE) { 02876 SDValue OpOp = Operand.getNode()->getOperand(0); 02877 if (OpOp.getValueType() == VT) 02878 return OpOp; 02879 } 02880 break; 02881 case ISD::TRUNCATE: 02882 assert(VT.isInteger() && Operand.getValueType().isInteger() && 02883 "Invalid TRUNCATE!"); 02884 if (Operand.getValueType() == VT) return Operand; // noop truncate 02885 assert(Operand.getValueType().getScalarType().bitsGT(VT.getScalarType()) && 02886 "Invalid truncate node, src < dst!"); 02887 assert((!VT.isVector() || 02888 VT.getVectorNumElements() == 02889 Operand.getValueType().getVectorNumElements()) && 02890 "Vector element count mismatch!"); 02891 if (OpOpcode == ISD::TRUNCATE) 02892 return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0)); 02893 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND || 02894 OpOpcode == ISD::ANY_EXTEND) { 02895 // If the source is smaller than the dest, we still need an extend. 02896 if (Operand.getNode()->getOperand(0).getValueType().getScalarType() 02897 .bitsLT(VT.getScalarType())) 02898 return getNode(OpOpcode, DL, VT, Operand.getNode()->getOperand(0)); 02899 if (Operand.getNode()->getOperand(0).getValueType().bitsGT(VT)) 02900 return getNode(ISD::TRUNCATE, DL, VT, Operand.getNode()->getOperand(0)); 02901 return Operand.getNode()->getOperand(0); 02902 } 02903 if (OpOpcode == ISD::UNDEF) 02904 return getUNDEF(VT); 02905 break; 02906 case ISD::BITCAST: 02907 // Basic sanity checking. 02908 assert(VT.getSizeInBits() == Operand.getValueType().getSizeInBits() 02909 && "Cannot BITCAST between types of different sizes!"); 02910 if (VT == Operand.getValueType()) return Operand; // noop conversion. 02911 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x) 02912 return getNode(ISD::BITCAST, DL, VT, Operand.getOperand(0)); 02913 if (OpOpcode == ISD::UNDEF) 02914 return getUNDEF(VT); 02915 break; 02916 case ISD::SCALAR_TO_VECTOR: 02917 assert(VT.isVector() && !Operand.getValueType().isVector() && 02918 (VT.getVectorElementType() == Operand.getValueType() || 02919 (VT.getVectorElementType().isInteger() && 02920 Operand.getValueType().isInteger() && 02921 VT.getVectorElementType().bitsLE(Operand.getValueType()))) && 02922 "Illegal SCALAR_TO_VECTOR node!"); 02923 if (OpOpcode == ISD::UNDEF) 02924 return getUNDEF(VT); 02925 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined. 02926 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT && 02927 isa<ConstantSDNode>(Operand.getOperand(1)) && 02928 Operand.getConstantOperandVal(1) == 0 && 02929 Operand.getOperand(0).getValueType() == VT) 02930 return Operand.getOperand(0); 02931 break; 02932 case ISD::FNEG: 02933 // -(X-Y) -> (Y-X) is unsafe because when X==Y, -0.0 != +0.0 02934 if (getTarget().Options.UnsafeFPMath && OpOpcode == ISD::FSUB) 02935 return getNode(ISD::FSUB, DL, VT, Operand.getNode()->getOperand(1), 02936 Operand.getNode()->getOperand(0)); 02937 if (OpOpcode == ISD::FNEG) // --X -> X 02938 return Operand.getNode()->getOperand(0); 02939 break; 02940 case ISD::FABS: 02941 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X) 02942 return getNode(ISD::FABS, DL, VT, Operand.getNode()->getOperand(0)); 02943 break; 02944 } 02945 02946 SDNode *N; 02947 SDVTList VTs = getVTList(VT); 02948 if (VT != MVT::Glue) { // Don't CSE flag producing nodes 02949 FoldingSetNodeID ID; 02950 SDValue Ops[1] = { Operand }; 02951 AddNodeIDNode(ID, Opcode, VTs, Ops); 02952 void *IP = nullptr; 02953 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 02954 return SDValue(E, 0); 02955 02956 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 02957 DL.getDebugLoc(), VTs, Operand); 02958 CSEMap.InsertNode(N, IP); 02959 } else { 02960 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 02961 DL.getDebugLoc(), VTs, Operand); 02962 } 02963 02964 InsertNode(N); 02965 return SDValue(N, 0); 02966 } 02967 02968 SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, EVT VT, 02969 SDNode *Cst1, SDNode *Cst2) { 02970 // If the opcode is a target-specific ISD node, there's nothing we can 02971 // do here and the operand rules may not line up with the below, so 02972 // bail early. 02973 if (Opcode >= ISD::BUILTIN_OP_END) 02974 return SDValue(); 02975 02976 SmallVector<std::pair<ConstantSDNode *, ConstantSDNode *>, 4> Inputs; 02977 SmallVector<SDValue, 4> Outputs; 02978 EVT SVT = VT.getScalarType(); 02979 02980 ConstantSDNode *Scalar1 = dyn_cast<ConstantSDNode>(Cst1); 02981 ConstantSDNode *Scalar2 = dyn_cast<ConstantSDNode>(Cst2); 02982 if (Scalar1 && Scalar2 && (Scalar1->isOpaque() || Scalar2->isOpaque())) 02983 return SDValue(); 02984 02985 if (Scalar1 && Scalar2) 02986 // Scalar instruction. 02987 Inputs.push_back(std::make_pair(Scalar1, Scalar2)); 02988 else { 02989 // For vectors extract each constant element into Inputs so we can constant 02990 // fold them individually. 02991 BuildVectorSDNode *BV1 = dyn_cast<BuildVectorSDNode>(Cst1); 02992 BuildVectorSDNode *BV2 = dyn_cast<BuildVectorSDNode>(Cst2); 02993 if (!BV1 || !BV2) 02994 return SDValue(); 02995 02996 assert(BV1->getNumOperands() == BV2->getNumOperands() && "Out of sync!"); 02997 02998 for (unsigned I = 0, E = BV1->getNumOperands(); I != E; ++I) { 02999 ConstantSDNode *V1 = dyn_cast<ConstantSDNode>(BV1->getOperand(I)); 03000 ConstantSDNode *V2 = dyn_cast<ConstantSDNode>(BV2->getOperand(I)); 03001 if (!V1 || !V2) // Not a constant, bail. 03002 return SDValue(); 03003 03004 if (V1->isOpaque() || V2->isOpaque()) 03005 return SDValue(); 03006 03007 // Avoid BUILD_VECTOR nodes that perform implicit truncation. 03008 // FIXME: This is valid and could be handled by truncating the APInts. 03009 if (V1->getValueType(0) != SVT || V2->getValueType(0) != SVT) 03010 return SDValue(); 03011 03012 Inputs.push_back(std::make_pair(V1, V2)); 03013 } 03014 } 03015 03016 // We have a number of constant values, constant fold them element by element. 03017 for (unsigned I = 0, E = Inputs.size(); I != E; ++I) { 03018 const APInt &C1 = Inputs[I].first->getAPIntValue(); 03019 const APInt &C2 = Inputs[I].second->getAPIntValue(); 03020 03021 switch (Opcode) { 03022 case ISD::ADD: 03023 Outputs.push_back(getConstant(C1 + C2, SVT)); 03024 break; 03025 case ISD::SUB: 03026 Outputs.push_back(getConstant(C1 - C2, SVT)); 03027 break; 03028 case ISD::MUL: 03029 Outputs.push_back(getConstant(C1 * C2, SVT)); 03030 break; 03031 case ISD::UDIV: 03032 if (!C2.getBoolValue()) 03033 return SDValue(); 03034 Outputs.push_back(getConstant(C1.udiv(C2), SVT)); 03035 break; 03036 case ISD::UREM: 03037 if (!C2.getBoolValue()) 03038 return SDValue(); 03039 Outputs.push_back(getConstant(C1.urem(C2), SVT)); 03040 break; 03041 case ISD::SDIV: 03042 if (!C2.getBoolValue()) 03043 return SDValue(); 03044 Outputs.push_back(getConstant(C1.sdiv(C2), SVT)); 03045 break; 03046 case ISD::SREM: 03047 if (!C2.getBoolValue()) 03048 return SDValue(); 03049 Outputs.push_back(getConstant(C1.srem(C2), SVT)); 03050 break; 03051 case ISD::AND: 03052 Outputs.push_back(getConstant(C1 & C2, SVT)); 03053 break; 03054 case ISD::OR: 03055 Outputs.push_back(getConstant(C1 | C2, SVT)); 03056 break; 03057 case ISD::XOR: 03058 Outputs.push_back(getConstant(C1 ^ C2, SVT)); 03059 break; 03060 case ISD::SHL: 03061 Outputs.push_back(getConstant(C1 << C2, SVT)); 03062 break; 03063 case ISD::SRL: 03064 Outputs.push_back(getConstant(C1.lshr(C2), SVT)); 03065 break; 03066 case ISD::SRA: 03067 Outputs.push_back(getConstant(C1.ashr(C2), SVT)); 03068 break; 03069 case ISD::ROTL: 03070 Outputs.push_back(getConstant(C1.rotl(C2), SVT)); 03071 break; 03072 case ISD::ROTR: 03073 Outputs.push_back(getConstant(C1.rotr(C2), SVT)); 03074 break; 03075 default: 03076 return SDValue(); 03077 } 03078 } 03079 03080 assert((Scalar1 && Scalar2) || (VT.getVectorNumElements() == Outputs.size() && 03081 "Expected a scalar or vector!")); 03082 03083 // Handle the scalar case first. 03084 if (!VT.isVector()) 03085 return Outputs.back(); 03086 03087 // We may have a vector type but a scalar result. Create a splat. 03088 Outputs.resize(VT.getVectorNumElements(), Outputs.back()); 03089 03090 // Build a big vector out of the scalar elements we generated. 03091 return getNode(ISD::BUILD_VECTOR, SDLoc(), VT, Outputs); 03092 } 03093 03094 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1, 03095 SDValue N2, bool nuw, bool nsw, bool exact) { 03096 ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode()); 03097 ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.getNode()); 03098 switch (Opcode) { 03099 default: break; 03100 case ISD::TokenFactor: 03101 assert(VT == MVT::Other && N1.getValueType() == MVT::Other && 03102 N2.getValueType() == MVT::Other && "Invalid token factor!"); 03103 // Fold trivial token factors. 03104 if (N1.getOpcode() == ISD::EntryToken) return N2; 03105 if (N2.getOpcode() == ISD::EntryToken) return N1; 03106 if (N1 == N2) return N1; 03107 break; 03108 case ISD::CONCAT_VECTORS: 03109 // Concat of UNDEFs is UNDEF. 03110 if (N1.getOpcode() == ISD::UNDEF && 03111 N2.getOpcode() == ISD::UNDEF) 03112 return getUNDEF(VT); 03113 03114 // A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to 03115 // one big BUILD_VECTOR. 03116 if (N1.getOpcode() == ISD::BUILD_VECTOR && 03117 N2.getOpcode() == ISD::BUILD_VECTOR) { 03118 SmallVector<SDValue, 16> Elts(N1.getNode()->op_begin(), 03119 N1.getNode()->op_end()); 03120 Elts.append(N2.getNode()->op_begin(), N2.getNode()->op_end()); 03121 return getNode(ISD::BUILD_VECTOR, DL, VT, Elts); 03122 } 03123 break; 03124 case ISD::AND: 03125 assert(VT.isInteger() && "This operator does not apply to FP types!"); 03126 assert(N1.getValueType() == N2.getValueType() && 03127 N1.getValueType() == VT && "Binary operator types must match!"); 03128 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's 03129 // worth handling here. 03130 if (N2C && N2C->isNullValue()) 03131 return N2; 03132 if (N2C && N2C->isAllOnesValue()) // X & -1 -> X 03133 return N1; 03134 break; 03135 case ISD::OR: 03136 case ISD::XOR: 03137 case ISD::ADD: 03138 case ISD::SUB: 03139 assert(VT.isInteger() && "This operator does not apply to FP types!"); 03140 assert(N1.getValueType() == N2.getValueType() && 03141 N1.getValueType() == VT && "Binary operator types must match!"); 03142 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so 03143 // it's worth handling here. 03144 if (N2C && N2C->isNullValue()) 03145 return N1; 03146 break; 03147 case ISD::UDIV: 03148 case ISD::UREM: 03149 case ISD::MULHU: 03150 case ISD::MULHS: 03151 case ISD::MUL: 03152 case ISD::SDIV: 03153 case ISD::SREM: 03154 assert(VT.isInteger() && "This operator does not apply to FP types!"); 03155 assert(N1.getValueType() == N2.getValueType() && 03156 N1.getValueType() == VT && "Binary operator types must match!"); 03157 break; 03158 case ISD::FADD: 03159 case ISD::FSUB: 03160 case ISD::FMUL: 03161 case ISD::FDIV: 03162 case ISD::FREM: 03163 if (getTarget().Options.UnsafeFPMath) { 03164 if (Opcode == ISD::FADD) { 03165 // 0+x --> x 03166 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1)) 03167 if (CFP->getValueAPF().isZero()) 03168 return N2; 03169 // x+0 --> x 03170 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N2)) 03171 if (CFP->getValueAPF().isZero()) 03172 return N1; 03173 } else if (Opcode == ISD::FSUB) { 03174 // x-0 --> x 03175 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N2)) 03176 if (CFP->getValueAPF().isZero()) 03177 return N1; 03178 } else if (Opcode == ISD::FMUL) { 03179 ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1); 03180 SDValue V = N2; 03181 03182 // If the first operand isn't the constant, try the second 03183 if (!CFP) { 03184 CFP = dyn_cast<ConstantFPSDNode>(N2); 03185 V = N1; 03186 } 03187 03188 if (CFP) { 03189 // 0*x --> 0 03190 if (CFP->isZero()) 03191 return SDValue(CFP,0); 03192 // 1*x --> x 03193 if (CFP->isExactlyValue(1.0)) 03194 return V; 03195 } 03196 } 03197 } 03198 assert(VT.isFloatingPoint() && "This operator only applies to FP types!"); 03199 assert(N1.getValueType() == N2.getValueType() && 03200 N1.getValueType() == VT && "Binary operator types must match!"); 03201 break; 03202 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match. 03203 assert(N1.getValueType() == VT && 03204 N1.getValueType().isFloatingPoint() && 03205 N2.getValueType().isFloatingPoint() && 03206 "Invalid FCOPYSIGN!"); 03207 break; 03208 case ISD::SHL: 03209 case ISD::SRA: 03210 case ISD::SRL: 03211 case ISD::ROTL: 03212 case ISD::ROTR: 03213 assert(VT == N1.getValueType() && 03214 "Shift operators return type must be the same as their first arg"); 03215 assert(VT.isInteger() && N2.getValueType().isInteger() && 03216 "Shifts only work on integers"); 03217 assert((!VT.isVector() || VT == N2.getValueType()) && 03218 "Vector shift amounts must be in the same as their first arg"); 03219 // Verify that the shift amount VT is bit enough to hold valid shift 03220 // amounts. This catches things like trying to shift an i1024 value by an 03221 // i8, which is easy to fall into in generic code that uses 03222 // TLI.getShiftAmount(). 03223 assert(N2.getValueType().getSizeInBits() >= 03224 Log2_32_Ceil(N1.getValueType().getSizeInBits()) && 03225 "Invalid use of small shift amount with oversized value!"); 03226 03227 // Always fold shifts of i1 values so the code generator doesn't need to 03228 // handle them. Since we know the size of the shift has to be less than the 03229 // size of the value, the shift/rotate count is guaranteed to be zero. 03230 if (VT == MVT::i1) 03231 return N1; 03232 if (N2C && N2C->isNullValue()) 03233 return N1; 03234 break; 03235 case ISD::FP_ROUND_INREG: { 03236 EVT EVT = cast<VTSDNode>(N2)->getVT(); 03237 assert(VT == N1.getValueType() && "Not an inreg round!"); 03238 assert(VT.isFloatingPoint() && EVT.isFloatingPoint() && 03239 "Cannot FP_ROUND_INREG integer types"); 03240 assert(EVT.isVector() == VT.isVector() && 03241 "FP_ROUND_INREG type should be vector iff the operand " 03242 "type is vector!"); 03243 assert((!EVT.isVector() || 03244 EVT.getVectorNumElements() == VT.getVectorNumElements()) && 03245 "Vector element counts must match in FP_ROUND_INREG"); 03246 assert(EVT.bitsLE(VT) && "Not rounding down!"); 03247 (void)EVT; 03248 if (cast<VTSDNode>(N2)->getVT() == VT) return N1; // Not actually rounding. 03249 break; 03250 } 03251 case ISD::FP_ROUND: 03252 assert(VT.isFloatingPoint() && 03253 N1.getValueType().isFloatingPoint() && 03254 VT.bitsLE(N1.getValueType()) && 03255 isa<ConstantSDNode>(N2) && "Invalid FP_ROUND!"); 03256 if (N1.getValueType() == VT) return N1; // noop conversion. 03257 break; 03258 case ISD::AssertSext: 03259 case ISD::AssertZext: { 03260 EVT EVT = cast<VTSDNode>(N2)->getVT(); 03261 assert(VT == N1.getValueType() && "Not an inreg extend!"); 03262 assert(VT.isInteger() && EVT.isInteger() && 03263 "Cannot *_EXTEND_INREG FP types"); 03264 assert(!EVT.isVector() && 03265 "AssertSExt/AssertZExt type should be the vector element type " 03266 "rather than the vector type!"); 03267 assert(EVT.bitsLE(VT) && "Not extending!"); 03268 if (VT == EVT) return N1; // noop assertion. 03269 break; 03270 } 03271 case ISD::SIGN_EXTEND_INREG: { 03272 EVT EVT = cast<VTSDNode>(N2)->getVT(); 03273 assert(VT == N1.getValueType() && "Not an inreg extend!"); 03274 assert(VT.isInteger() && EVT.isInteger() && 03275 "Cannot *_EXTEND_INREG FP types"); 03276 assert(EVT.isVector() == VT.isVector() && 03277 "SIGN_EXTEND_INREG type should be vector iff the operand " 03278 "type is vector!"); 03279 assert((!EVT.isVector() || 03280 EVT.getVectorNumElements() == VT.getVectorNumElements()) && 03281 "Vector element counts must match in SIGN_EXTEND_INREG"); 03282 assert(EVT.bitsLE(VT) && "Not extending!"); 03283 if (EVT == VT) return N1; // Not actually extending 03284 03285 if (N1C) { 03286 APInt Val = N1C->getAPIntValue(); 03287 unsigned FromBits = EVT.getScalarType().getSizeInBits(); 03288 Val <<= Val.getBitWidth()-FromBits; 03289 Val = Val.ashr(Val.getBitWidth()-FromBits); 03290 return getConstant(Val, VT); 03291 } 03292 break; 03293 } 03294 case ISD::EXTRACT_VECTOR_ELT: 03295 // EXTRACT_VECTOR_ELT of an UNDEF is an UNDEF. 03296 if (N1.getOpcode() == ISD::UNDEF) 03297 return getUNDEF(VT); 03298 03299 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is 03300 // expanding copies of large vectors from registers. 03301 if (N2C && 03302 N1.getOpcode() == ISD::CONCAT_VECTORS && 03303 N1.getNumOperands() > 0) { 03304 unsigned Factor = 03305 N1.getOperand(0).getValueType().getVectorNumElements(); 03306 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, 03307 N1.getOperand(N2C->getZExtValue() / Factor), 03308 getConstant(N2C->getZExtValue() % Factor, 03309 N2.getValueType())); 03310 } 03311 03312 // EXTRACT_VECTOR_ELT of BUILD_VECTOR is often formed while lowering is 03313 // expanding large vector constants. 03314 if (N2C && N1.getOpcode() == ISD::BUILD_VECTOR) { 03315 SDValue Elt = N1.getOperand(N2C->getZExtValue()); 03316 03317 if (VT != Elt.getValueType()) 03318 // If the vector element type is not legal, the BUILD_VECTOR operands 03319 // are promoted and implicitly truncated, and the result implicitly 03320 // extended. Make that explicit here. 03321 Elt = getAnyExtOrTrunc(Elt, DL, VT); 03322 03323 return Elt; 03324 } 03325 03326 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector 03327 // operations are lowered to scalars. 03328 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) { 03329 // If the indices are the same, return the inserted element else 03330 // if the indices are known different, extract the element from 03331 // the original vector. 03332 SDValue N1Op2 = N1.getOperand(2); 03333 ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2.getNode()); 03334 03335 if (N1Op2C && N2C) { 03336 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) { 03337 if (VT == N1.getOperand(1).getValueType()) 03338 return N1.getOperand(1); 03339 else 03340 return getSExtOrTrunc(N1.getOperand(1), DL, VT); 03341 } 03342 03343 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2); 03344 } 03345 } 03346 break; 03347 case ISD::EXTRACT_ELEMENT: 03348 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!"); 03349 assert(!N1.getValueType().isVector() && !VT.isVector() && 03350 (N1.getValueType().isInteger() == VT.isInteger()) && 03351 N1.getValueType() != VT && 03352 "Wrong types for EXTRACT_ELEMENT!"); 03353 03354 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding 03355 // 64-bit integers into 32-bit parts. Instead of building the extract of 03356 // the BUILD_PAIR, only to have legalize rip it apart, just do it now. 03357 if (N1.getOpcode() == ISD::BUILD_PAIR) 03358 return N1.getOperand(N2C->getZExtValue()); 03359 03360 // EXTRACT_ELEMENT of a constant int is also very common. 03361 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N1)) { 03362 unsigned ElementSize = VT.getSizeInBits(); 03363 unsigned Shift = ElementSize * N2C->getZExtValue(); 03364 APInt ShiftedVal = C->getAPIntValue().lshr(Shift); 03365 return getConstant(ShiftedVal.trunc(ElementSize), VT); 03366 } 03367 break; 03368 case ISD::EXTRACT_SUBVECTOR: { 03369 SDValue Index = N2; 03370 if (VT.isSimple() && N1.getValueType().isSimple()) { 03371 assert(VT.isVector() && N1.getValueType().isVector() && 03372 "Extract subvector VTs must be a vectors!"); 03373 assert(VT.getVectorElementType() == 03374 N1.getValueType().getVectorElementType() && 03375 "Extract subvector VTs must have the same element type!"); 03376 assert(VT.getSimpleVT() <= N1.getSimpleValueType() && 03377 "Extract subvector must be from larger vector to smaller vector!"); 03378 03379 if (isa<ConstantSDNode>(Index.getNode())) { 03380 assert((VT.getVectorNumElements() + 03381 cast<ConstantSDNode>(Index.getNode())->getZExtValue() 03382 <= N1.getValueType().getVectorNumElements()) 03383 && "Extract subvector overflow!"); 03384 } 03385 03386 // Trivial extraction. 03387 if (VT.getSimpleVT() == N1.getSimpleValueType()) 03388 return N1; 03389 } 03390 break; 03391 } 03392 } 03393 03394 // Perform trivial constant folding. 03395 SDValue SV = FoldConstantArithmetic(Opcode, VT, N1.getNode(), N2.getNode()); 03396 if (SV.getNode()) return SV; 03397 03398 // Canonicalize constant to RHS if commutative. 03399 if (N1C && !N2C && isCommutativeBinOp(Opcode)) { 03400 std::swap(N1C, N2C); 03401 std::swap(N1, N2); 03402 } 03403 03404 // Constant fold FP operations. 03405 bool HasFPExceptions = TLI->hasFloatingPointExceptions(); 03406 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1.getNode()); 03407 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2.getNode()); 03408 if (N1CFP) { 03409 if (!N2CFP && isCommutativeBinOp(Opcode)) { 03410 // Canonicalize constant to RHS if commutative. 03411 std::swap(N1CFP, N2CFP); 03412 std::swap(N1, N2); 03413 } else if (N2CFP) { 03414 APFloat V1 = N1CFP->getValueAPF(), V2 = N2CFP->getValueAPF(); 03415 APFloat::opStatus s; 03416 switch (Opcode) { 03417 case ISD::FADD: 03418 s = V1.add(V2, APFloat::rmNearestTiesToEven); 03419 if (!HasFPExceptions || s != APFloat::opInvalidOp) 03420 return getConstantFP(V1, VT); 03421 break; 03422 case ISD::FSUB: 03423 s = V1.subtract(V2, APFloat::rmNearestTiesToEven); 03424 if (!HasFPExceptions || s!=APFloat::opInvalidOp) 03425 return getConstantFP(V1, VT); 03426 break; 03427 case ISD::FMUL: 03428 s = V1.multiply(V2, APFloat::rmNearestTiesToEven); 03429 if (!HasFPExceptions || s!=APFloat::opInvalidOp) 03430 return getConstantFP(V1, VT); 03431 break; 03432 case ISD::FDIV: 03433 s = V1.divide(V2, APFloat::rmNearestTiesToEven); 03434 if (!HasFPExceptions || (s!=APFloat::opInvalidOp && 03435 s!=APFloat::opDivByZero)) { 03436 return getConstantFP(V1, VT); 03437 } 03438 break; 03439 case ISD::FREM : 03440 s = V1.mod(V2, APFloat::rmNearestTiesToEven); 03441 if (!HasFPExceptions || (s!=APFloat::opInvalidOp && 03442 s!=APFloat::opDivByZero)) { 03443 return getConstantFP(V1, VT); 03444 } 03445 break; 03446 case ISD::FCOPYSIGN: 03447 V1.copySign(V2); 03448 return getConstantFP(V1, VT); 03449 default: break; 03450 } 03451 } 03452 03453 if (Opcode == ISD::FP_ROUND) { 03454 APFloat V = N1CFP->getValueAPF(); // make copy 03455 bool ignored; 03456 // This can return overflow, underflow, or inexact; we don't care. 03457 // FIXME need to be more flexible about rounding mode. 03458 (void)V.convert(EVTToAPFloatSemantics(VT), 03459 APFloat::rmNearestTiesToEven, &ignored); 03460 return getConstantFP(V, VT); 03461 } 03462 } 03463 03464 // Canonicalize an UNDEF to the RHS, even over a constant. 03465 if (N1.getOpcode() == ISD::UNDEF) { 03466 if (isCommutativeBinOp(Opcode)) { 03467 std::swap(N1, N2); 03468 } else { 03469 switch (Opcode) { 03470 case ISD::FP_ROUND_INREG: 03471 case ISD::SIGN_EXTEND_INREG: 03472 case ISD::SUB: 03473 case ISD::FSUB: 03474 case ISD::FDIV: 03475 case ISD::FREM: 03476 case ISD::SRA: 03477 return N1; // fold op(undef, arg2) -> undef 03478 case ISD::UDIV: 03479 case ISD::SDIV: 03480 case ISD::UREM: 03481 case ISD::SREM: 03482 case ISD::SRL: 03483 case ISD::SHL: 03484 if (!VT.isVector()) 03485 return getConstant(0, VT); // fold op(undef, arg2) -> 0 03486 // For vectors, we can't easily build an all zero vector, just return 03487 // the LHS. 03488 return N2; 03489 } 03490 } 03491 } 03492 03493 // Fold a bunch of operators when the RHS is undef. 03494 if (N2.getOpcode() == ISD::UNDEF) { 03495 switch (Opcode) { 03496 case ISD::XOR: 03497 if (N1.getOpcode() == ISD::UNDEF) 03498 // Handle undef ^ undef -> 0 special case. This is a common 03499 // idiom (misuse). 03500 return getConstant(0, VT); 03501 // fallthrough 03502 case ISD::ADD: 03503 case ISD::ADDC: 03504 case ISD::ADDE: 03505 case ISD::SUB: 03506 case ISD::UDIV: 03507 case ISD::SDIV: 03508 case ISD::UREM: 03509 case ISD::SREM: 03510 return N2; // fold op(arg1, undef) -> undef 03511 case ISD::FADD: 03512 case ISD::FSUB: 03513 case ISD::FMUL: 03514 case ISD::FDIV: 03515 case ISD::FREM: 03516 if (getTarget().Options.UnsafeFPMath) 03517 return N2; 03518 break; 03519 case ISD::MUL: 03520 case ISD::AND: 03521 case ISD::SRL: 03522 case ISD::SHL: 03523 if (!VT.isVector()) 03524 return getConstant(0, VT); // fold op(arg1, undef) -> 0 03525 // For vectors, we can't easily build an all zero vector, just return 03526 // the LHS. 03527 return N1; 03528 case ISD::OR: 03529 if (!VT.isVector()) 03530 return getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), VT); 03531 // For vectors, we can't easily build an all one vector, just return 03532 // the LHS. 03533 return N1; 03534 case ISD::SRA: 03535 return N1; 03536 } 03537 } 03538 03539 // Memoize this node if possible. 03540 BinarySDNode *N; 03541 SDVTList VTs = getVTList(VT); 03542 const bool BinOpHasFlags = isBinOpWithFlags(Opcode); 03543 if (VT != MVT::Glue) { 03544 SDValue Ops[] = {N1, N2}; 03545 FoldingSetNodeID ID; 03546 AddNodeIDNode(ID, Opcode, VTs, Ops); 03547 if (BinOpHasFlags) 03548 AddBinaryNodeIDCustom(ID, Opcode, nuw, nsw, exact); 03549 void *IP = nullptr; 03550 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 03551 return SDValue(E, 0); 03552 03553 N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, nuw, nsw, exact); 03554 03555 CSEMap.InsertNode(N, IP); 03556 } else { 03557 03558 N = GetBinarySDNode(Opcode, DL, VTs, N1, N2, nuw, nsw, exact); 03559 } 03560 03561 InsertNode(N); 03562 return SDValue(N, 0); 03563 } 03564 03565 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 03566 SDValue N1, SDValue N2, SDValue N3) { 03567 // Perform various simplifications. 03568 ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode()); 03569 switch (Opcode) { 03570 case ISD::FMA: { 03571 ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1); 03572 ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2); 03573 ConstantFPSDNode *N3CFP = dyn_cast<ConstantFPSDNode>(N3); 03574 if (N1CFP && N2CFP && N3CFP) { 03575 APFloat V1 = N1CFP->getValueAPF(); 03576 const APFloat &V2 = N2CFP->getValueAPF(); 03577 const APFloat &V3 = N3CFP->getValueAPF(); 03578 APFloat::opStatus s = 03579 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven); 03580 if (s != APFloat::opInvalidOp) 03581 return getConstantFP(V1, VT); 03582 } 03583 break; 03584 } 03585 case ISD::CONCAT_VECTORS: 03586 // A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to 03587 // one big BUILD_VECTOR. 03588 if (N1.getOpcode() == ISD::BUILD_VECTOR && 03589 N2.getOpcode() == ISD::BUILD_VECTOR && 03590 N3.getOpcode() == ISD::BUILD_VECTOR) { 03591 SmallVector<SDValue, 16> Elts(N1.getNode()->op_begin(), 03592 N1.getNode()->op_end()); 03593 Elts.append(N2.getNode()->op_begin(), N2.getNode()->op_end()); 03594 Elts.append(N3.getNode()->op_begin(), N3.getNode()->op_end()); 03595 return getNode(ISD::BUILD_VECTOR, DL, VT, Elts); 03596 } 03597 break; 03598 case ISD::SETCC: { 03599 // Use FoldSetCC to simplify SETCC's. 03600 SDValue Simp = FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL); 03601 if (Simp.getNode()) return Simp; 03602 break; 03603 } 03604 case ISD::SELECT: 03605 if (N1C) { 03606 if (N1C->getZExtValue()) 03607 return N2; // select true, X, Y -> X 03608 return N3; // select false, X, Y -> Y 03609 } 03610 03611 if (N2 == N3) return N2; // select C, X, X -> X 03612 break; 03613 case ISD::VECTOR_SHUFFLE: 03614 llvm_unreachable("should use getVectorShuffle constructor!"); 03615 case ISD::INSERT_SUBVECTOR: { 03616 SDValue Index = N3; 03617 if (VT.isSimple() && N1.getValueType().isSimple() 03618 && N2.getValueType().isSimple()) { 03619 assert(VT.isVector() && N1.getValueType().isVector() && 03620 N2.getValueType().isVector() && 03621 "Insert subvector VTs must be a vectors"); 03622 assert(VT == N1.getValueType() && 03623 "Dest and insert subvector source types must match!"); 03624 assert(N2.getSimpleValueType() <= N1.getSimpleValueType() && 03625 "Insert subvector must be from smaller vector to larger vector!"); 03626 if (isa<ConstantSDNode>(Index.getNode())) { 03627 assert((N2.getValueType().getVectorNumElements() + 03628 cast<ConstantSDNode>(Index.getNode())->getZExtValue() 03629 <= VT.getVectorNumElements()) 03630 && "Insert subvector overflow!"); 03631 } 03632 03633 // Trivial insertion. 03634 if (VT.getSimpleVT() == N2.getSimpleValueType()) 03635 return N2; 03636 } 03637 break; 03638 } 03639 case ISD::BITCAST: 03640 // Fold bit_convert nodes from a type to themselves. 03641 if (N1.getValueType() == VT) 03642 return N1; 03643 break; 03644 } 03645 03646 // Memoize node if it doesn't produce a flag. 03647 SDNode *N; 03648 SDVTList VTs = getVTList(VT); 03649 if (VT != MVT::Glue) { 03650 SDValue Ops[] = { N1, N2, N3 }; 03651 FoldingSetNodeID ID; 03652 AddNodeIDNode(ID, Opcode, VTs, Ops); 03653 void *IP = nullptr; 03654 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 03655 return SDValue(E, 0); 03656 03657 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 03658 DL.getDebugLoc(), VTs, N1, N2, N3); 03659 CSEMap.InsertNode(N, IP); 03660 } else { 03661 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 03662 DL.getDebugLoc(), VTs, N1, N2, N3); 03663 } 03664 03665 InsertNode(N); 03666 return SDValue(N, 0); 03667 } 03668 03669 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 03670 SDValue N1, SDValue N2, SDValue N3, 03671 SDValue N4) { 03672 SDValue Ops[] = { N1, N2, N3, N4 }; 03673 return getNode(Opcode, DL, VT, Ops); 03674 } 03675 03676 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 03677 SDValue N1, SDValue N2, SDValue N3, 03678 SDValue N4, SDValue N5) { 03679 SDValue Ops[] = { N1, N2, N3, N4, N5 }; 03680 return getNode(Opcode, DL, VT, Ops); 03681 } 03682 03683 /// getStackArgumentTokenFactor - Compute a TokenFactor to force all 03684 /// the incoming stack arguments to be loaded from the stack. 03685 SDValue SelectionDAG::getStackArgumentTokenFactor(SDValue Chain) { 03686 SmallVector<SDValue, 8> ArgChains; 03687 03688 // Include the original chain at the beginning of the list. When this is 03689 // used by target LowerCall hooks, this helps legalize find the 03690 // CALLSEQ_BEGIN node. 03691 ArgChains.push_back(Chain); 03692 03693 // Add a chain value for each stack argument. 03694 for (SDNode::use_iterator U = getEntryNode().getNode()->use_begin(), 03695 UE = getEntryNode().getNode()->use_end(); U != UE; ++U) 03696 if (LoadSDNode *L = dyn_cast<LoadSDNode>(*U)) 03697 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr())) 03698 if (FI->getIndex() < 0) 03699 ArgChains.push_back(SDValue(L, 1)); 03700 03701 // Build a tokenfactor for all the chains. 03702 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains); 03703 } 03704 03705 /// getMemsetValue - Vectorized representation of the memset value 03706 /// operand. 03707 static SDValue getMemsetValue(SDValue Value, EVT VT, SelectionDAG &DAG, 03708 SDLoc dl) { 03709 assert(Value.getOpcode() != ISD::UNDEF); 03710 03711 unsigned NumBits = VT.getScalarType().getSizeInBits(); 03712 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Value)) { 03713 assert(C->getAPIntValue().getBitWidth() == 8); 03714 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue()); 03715 if (VT.isInteger()) 03716 return DAG.getConstant(Val, VT); 03717 return DAG.getConstantFP(APFloat(DAG.EVTToAPFloatSemantics(VT), Val), VT); 03718 } 03719 03720 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Value); 03721 if (NumBits > 8) { 03722 // Use a multiplication with 0x010101... to extend the input to the 03723 // required length. 03724 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01)); 03725 Value = DAG.getNode(ISD::MUL, dl, VT, Value, DAG.getConstant(Magic, VT)); 03726 } 03727 03728 return Value; 03729 } 03730 03731 /// getMemsetStringVal - Similar to getMemsetValue. Except this is only 03732 /// used when a memcpy is turned into a memset when the source is a constant 03733 /// string ptr. 03734 static SDValue getMemsetStringVal(EVT VT, SDLoc dl, SelectionDAG &DAG, 03735 const TargetLowering &TLI, StringRef Str) { 03736 // Handle vector with all elements zero. 03737 if (Str.empty()) { 03738 if (VT.isInteger()) 03739 return DAG.getConstant(0, VT); 03740 else if (VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128) 03741 return DAG.getConstantFP(0.0, VT); 03742 else if (VT.isVector()) { 03743 unsigned NumElts = VT.getVectorNumElements(); 03744 MVT EltVT = (VT.getVectorElementType() == MVT::f32) ? MVT::i32 : MVT::i64; 03745 return DAG.getNode(ISD::BITCAST, dl, VT, 03746 DAG.getConstant(0, EVT::getVectorVT(*DAG.getContext(), 03747 EltVT, NumElts))); 03748 } else 03749 llvm_unreachable("Expected type!"); 03750 } 03751 03752 assert(!VT.isVector() && "Can't handle vector type here!"); 03753 unsigned NumVTBits = VT.getSizeInBits(); 03754 unsigned NumVTBytes = NumVTBits / 8; 03755 unsigned NumBytes = std::min(NumVTBytes, unsigned(Str.size())); 03756 03757 APInt Val(NumVTBits, 0); 03758 if (TLI.isLittleEndian()) { 03759 for (unsigned i = 0; i != NumBytes; ++i) 03760 Val |= (uint64_t)(unsigned char)Str[i] << i*8; 03761 } else { 03762 for (unsigned i = 0; i != NumBytes; ++i) 03763 Val |= (uint64_t)(unsigned char)Str[i] << (NumVTBytes-i-1)*8; 03764 } 03765 03766 // If the "cost" of materializing the integer immediate is less than the cost 03767 // of a load, then it is cost effective to turn the load into the immediate. 03768 Type *Ty = VT.getTypeForEVT(*DAG.getContext()); 03769 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty)) 03770 return DAG.getConstant(Val, VT); 03771 return SDValue(nullptr, 0); 03772 } 03773 03774 /// getMemBasePlusOffset - Returns base and offset node for the 03775 /// 03776 static SDValue getMemBasePlusOffset(SDValue Base, unsigned Offset, SDLoc dl, 03777 SelectionDAG &DAG) { 03778 EVT VT = Base.getValueType(); 03779 return DAG.getNode(ISD::ADD, dl, 03780 VT, Base, DAG.getConstant(Offset, VT)); 03781 } 03782 03783 /// isMemSrcFromString - Returns true if memcpy source is a string constant. 03784 /// 03785 static bool isMemSrcFromString(SDValue Src, StringRef &Str) { 03786 unsigned SrcDelta = 0; 03787 GlobalAddressSDNode *G = nullptr; 03788 if (Src.getOpcode() == ISD::GlobalAddress) 03789 G = cast<GlobalAddressSDNode>(Src); 03790 else if (Src.getOpcode() == ISD::ADD && 03791 Src.getOperand(0).getOpcode() == ISD::GlobalAddress && 03792 Src.getOperand(1).getOpcode() == ISD::Constant) { 03793 G = cast<GlobalAddressSDNode>(Src.getOperand(0)); 03794 SrcDelta = cast<ConstantSDNode>(Src.getOperand(1))->getZExtValue(); 03795 } 03796 if (!G) 03797 return false; 03798 03799 return getConstantStringInfo(G->getGlobal(), Str, SrcDelta, false); 03800 } 03801 03802 /// FindOptimalMemOpLowering - Determines the optimial series memory ops 03803 /// to replace the memset / memcpy. Return true if the number of memory ops 03804 /// is below the threshold. It returns the types of the sequence of 03805 /// memory ops to perform memset / memcpy by reference. 03806 static bool FindOptimalMemOpLowering(std::vector<EVT> &MemOps, 03807 unsigned Limit, uint64_t Size, 03808 unsigned DstAlign, unsigned SrcAlign, 03809 bool IsMemset, 03810 bool ZeroMemset, 03811 bool MemcpyStrSrc, 03812 bool AllowOverlap, 03813 SelectionDAG &DAG, 03814 const TargetLowering &TLI) { 03815 assert((SrcAlign == 0 || SrcAlign >= DstAlign) && 03816 "Expecting memcpy / memset source to meet alignment requirement!"); 03817 // If 'SrcAlign' is zero, that means the memory operation does not need to 03818 // load the value, i.e. memset or memcpy from constant string. Otherwise, 03819 // it's the inferred alignment of the source. 'DstAlign', on the other hand, 03820 // is the specified alignment of the memory operation. If it is zero, that 03821 // means it's possible to change the alignment of the destination. 03822 // 'MemcpyStrSrc' indicates whether the memcpy source is constant so it does 03823 // not need to be loaded. 03824 EVT VT = TLI.getOptimalMemOpType(Size, DstAlign, SrcAlign, 03825 IsMemset, ZeroMemset, MemcpyStrSrc, 03826 DAG.getMachineFunction()); 03827 03828 if (VT == MVT::Other) { 03829 unsigned AS = 0; 03830 if (DstAlign >= TLI.getDataLayout()->getPointerPrefAlignment(AS) || 03831 TLI.allowsMisalignedMemoryAccesses(VT, AS, DstAlign)) { 03832 VT = TLI.getPointerTy(); 03833 } else { 03834 switch (DstAlign & 7) { 03835 case 0: VT = MVT::i64; break; 03836 case 4: VT = MVT::i32; break; 03837 case 2: VT = MVT::i16; break; 03838 default: VT = MVT::i8; break; 03839 } 03840 } 03841 03842 MVT LVT = MVT::i64; 03843 while (!TLI.isTypeLegal(LVT)) 03844 LVT = (MVT::SimpleValueType)(LVT.SimpleTy - 1); 03845 assert(LVT.isInteger()); 03846 03847 if (VT.bitsGT(LVT)) 03848 VT = LVT; 03849 } 03850 03851 unsigned NumMemOps = 0; 03852 while (Size != 0) { 03853 unsigned VTSize = VT.getSizeInBits() / 8; 03854 while (VTSize > Size) { 03855 // For now, only use non-vector load / store's for the left-over pieces. 03856 EVT NewVT = VT; 03857 unsigned NewVTSize; 03858 03859 bool Found = false; 03860 if (VT.isVector() || VT.isFloatingPoint()) { 03861 NewVT = (VT.getSizeInBits() > 64) ? MVT::i64 : MVT::i32; 03862 if (TLI.isOperationLegalOrCustom(ISD::STORE, NewVT) && 03863 TLI.isSafeMemOpType(NewVT.getSimpleVT())) 03864 Found = true; 03865 else if (NewVT == MVT::i64 && 03866 TLI.isOperationLegalOrCustom(ISD::STORE, MVT::f64) && 03867 TLI.isSafeMemOpType(MVT::f64)) { 03868 // i64 is usually not legal on 32-bit targets, but f64 may be. 03869 NewVT = MVT::f64; 03870 Found = true; 03871 } 03872 } 03873 03874 if (!Found) { 03875 do { 03876 NewVT = (MVT::SimpleValueType)(NewVT.getSimpleVT().SimpleTy - 1); 03877 if (NewVT == MVT::i8) 03878 break; 03879 } while (!TLI.isSafeMemOpType(NewVT.getSimpleVT())); 03880 } 03881 NewVTSize = NewVT.getSizeInBits() / 8; 03882 03883 // If the new VT cannot cover all of the remaining bits, then consider 03884 // issuing a (or a pair of) unaligned and overlapping load / store. 03885 // FIXME: Only does this for 64-bit or more since we don't have proper 03886 // cost model for unaligned load / store. 03887 bool Fast; 03888 unsigned AS = 0; 03889 if (NumMemOps && AllowOverlap && 03890 VTSize >= 8 && NewVTSize < Size && 03891 TLI.allowsMisalignedMemoryAccesses(VT, AS, DstAlign, &Fast) && Fast) 03892 VTSize = Size; 03893 else { 03894 VT = NewVT; 03895 VTSize = NewVTSize; 03896 } 03897 } 03898 03899 if (++NumMemOps > Limit) 03900 return false; 03901 03902 MemOps.push_back(VT); 03903 Size -= VTSize; 03904 } 03905 03906 return true; 03907 } 03908 03909 static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, SDLoc dl, 03910 SDValue Chain, SDValue Dst, 03911 SDValue Src, uint64_t Size, 03912 unsigned Align, bool isVol, 03913 bool AlwaysInline, 03914 MachinePointerInfo DstPtrInfo, 03915 MachinePointerInfo SrcPtrInfo) { 03916 // Turn a memcpy of undef to nop. 03917 if (Src.getOpcode() == ISD::UNDEF) 03918 return Chain; 03919 03920 // Expand memcpy to a series of load and store ops if the size operand falls 03921 // below a certain threshold. 03922 // TODO: In the AlwaysInline case, if the size is big then generate a loop 03923 // rather than maybe a humongous number of loads and stores. 03924 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 03925 std::vector<EVT> MemOps; 03926 bool DstAlignCanChange = false; 03927 MachineFunction &MF = DAG.getMachineFunction(); 03928 MachineFrameInfo *MFI = MF.getFrameInfo(); 03929 bool OptSize = 03930 MF.getFunction()->getAttributes(). 03931 hasAttribute(AttributeSet::FunctionIndex, Attribute::OptimizeForSize); 03932 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst); 03933 if (FI && !MFI->isFixedObjectIndex(FI->getIndex())) 03934 DstAlignCanChange = true; 03935 unsigned SrcAlign = DAG.InferPtrAlignment(Src); 03936 if (Align > SrcAlign) 03937 SrcAlign = Align; 03938 StringRef Str; 03939 bool CopyFromStr = isMemSrcFromString(Src, Str); 03940 bool isZeroStr = CopyFromStr && Str.empty(); 03941 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize); 03942 03943 if (!FindOptimalMemOpLowering(MemOps, Limit, Size, 03944 (DstAlignCanChange ? 0 : Align), 03945 (isZeroStr ? 0 : SrcAlign), 03946 false, false, CopyFromStr, true, DAG, TLI)) 03947 return SDValue(); 03948 03949 if (DstAlignCanChange) { 03950 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); 03951 unsigned NewAlign = (unsigned) TLI.getDataLayout()->getABITypeAlignment(Ty); 03952 03953 // Don't promote to an alignment that would require dynamic stack 03954 // realignment. 03955 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); 03956 if (!TRI->needsStackRealignment(MF)) 03957 while (NewAlign > Align && 03958 TLI.getDataLayout()->exceedsNaturalStackAlignment(NewAlign)) 03959 NewAlign /= 2; 03960 03961 if (NewAlign > Align) { 03962 // Give the stack frame object a larger alignment if needed. 03963 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) 03964 MFI->setObjectAlignment(FI->getIndex(), NewAlign); 03965 Align = NewAlign; 03966 } 03967 } 03968 03969 SmallVector<SDValue, 8> OutChains; 03970 unsigned NumMemOps = MemOps.size(); 03971 uint64_t SrcOff = 0, DstOff = 0; 03972 for (unsigned i = 0; i != NumMemOps; ++i) { 03973 EVT VT = MemOps[i]; 03974 unsigned VTSize = VT.getSizeInBits() / 8; 03975 SDValue Value, Store; 03976 03977 if (VTSize > Size) { 03978 // Issuing an unaligned load / store pair that overlaps with the previous 03979 // pair. Adjust the offset accordingly. 03980 assert(i == NumMemOps-1 && i != 0); 03981 SrcOff -= VTSize - Size; 03982 DstOff -= VTSize - Size; 03983 } 03984 03985 if (CopyFromStr && 03986 (isZeroStr || (VT.isInteger() && !VT.isVector()))) { 03987 // It's unlikely a store of a vector immediate can be done in a single 03988 // instruction. It would require a load from a constantpool first. 03989 // We only handle zero vectors here. 03990 // FIXME: Handle other cases where store of vector immediate is done in 03991 // a single instruction. 03992 Value = getMemsetStringVal(VT, dl, DAG, TLI, Str.substr(SrcOff)); 03993 if (Value.getNode()) 03994 Store = DAG.getStore(Chain, dl, Value, 03995 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 03996 DstPtrInfo.getWithOffset(DstOff), isVol, 03997 false, Align); 03998 } 03999 04000 if (!Store.getNode()) { 04001 // The type might not be legal for the target. This should only happen 04002 // if the type is smaller than a legal type, as on PPC, so the right 04003 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify 04004 // to Load/Store if NVT==VT. 04005 // FIXME does the case above also need this? 04006 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT); 04007 assert(NVT.bitsGE(VT)); 04008 Value = DAG.getExtLoad(ISD::EXTLOAD, dl, NVT, Chain, 04009 getMemBasePlusOffset(Src, SrcOff, dl, DAG), 04010 SrcPtrInfo.getWithOffset(SrcOff), VT, isVol, false, 04011 false, MinAlign(SrcAlign, SrcOff)); 04012 Store = DAG.getTruncStore(Chain, dl, Value, 04013 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 04014 DstPtrInfo.getWithOffset(DstOff), VT, isVol, 04015 false, Align); 04016 } 04017 OutChains.push_back(Store); 04018 SrcOff += VTSize; 04019 DstOff += VTSize; 04020 Size -= VTSize; 04021 } 04022 04023 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 04024 } 04025 04026 static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, SDLoc dl, 04027 SDValue Chain, SDValue Dst, 04028 SDValue Src, uint64_t Size, 04029 unsigned Align, bool isVol, 04030 bool AlwaysInline, 04031 MachinePointerInfo DstPtrInfo, 04032 MachinePointerInfo SrcPtrInfo) { 04033 // Turn a memmove of undef to nop. 04034 if (Src.getOpcode() == ISD::UNDEF) 04035 return Chain; 04036 04037 // Expand memmove to a series of load and store ops if the size operand falls 04038 // below a certain threshold. 04039 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 04040 std::vector<EVT> MemOps; 04041 bool DstAlignCanChange = false; 04042 MachineFunction &MF = DAG.getMachineFunction(); 04043 MachineFrameInfo *MFI = MF.getFrameInfo(); 04044 bool OptSize = MF.getFunction()->getAttributes(). 04045 hasAttribute(AttributeSet::FunctionIndex, Attribute::OptimizeForSize); 04046 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst); 04047 if (FI && !MFI->isFixedObjectIndex(FI->getIndex())) 04048 DstAlignCanChange = true; 04049 unsigned SrcAlign = DAG.InferPtrAlignment(Src); 04050 if (Align > SrcAlign) 04051 SrcAlign = Align; 04052 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize); 04053 04054 if (!FindOptimalMemOpLowering(MemOps, Limit, Size, 04055 (DstAlignCanChange ? 0 : Align), SrcAlign, 04056 false, false, false, false, DAG, TLI)) 04057 return SDValue(); 04058 04059 if (DstAlignCanChange) { 04060 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); 04061 unsigned NewAlign = (unsigned) TLI.getDataLayout()->getABITypeAlignment(Ty); 04062 if (NewAlign > Align) { 04063 // Give the stack frame object a larger alignment if needed. 04064 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) 04065 MFI->setObjectAlignment(FI->getIndex(), NewAlign); 04066 Align = NewAlign; 04067 } 04068 } 04069 04070 uint64_t SrcOff = 0, DstOff = 0; 04071 SmallVector<SDValue, 8> LoadValues; 04072 SmallVector<SDValue, 8> LoadChains; 04073 SmallVector<SDValue, 8> OutChains; 04074 unsigned NumMemOps = MemOps.size(); 04075 for (unsigned i = 0; i < NumMemOps; i++) { 04076 EVT VT = MemOps[i]; 04077 unsigned VTSize = VT.getSizeInBits() / 8; 04078 SDValue Value; 04079 04080 Value = DAG.getLoad(VT, dl, Chain, 04081 getMemBasePlusOffset(Src, SrcOff, dl, DAG), 04082 SrcPtrInfo.getWithOffset(SrcOff), isVol, 04083 false, false, SrcAlign); 04084 LoadValues.push_back(Value); 04085 LoadChains.push_back(Value.getValue(1)); 04086 SrcOff += VTSize; 04087 } 04088 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains); 04089 OutChains.clear(); 04090 for (unsigned i = 0; i < NumMemOps; i++) { 04091 EVT VT = MemOps[i]; 04092 unsigned VTSize = VT.getSizeInBits() / 8; 04093 SDValue Store; 04094 04095 Store = DAG.getStore(Chain, dl, LoadValues[i], 04096 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 04097 DstPtrInfo.getWithOffset(DstOff), isVol, false, Align); 04098 OutChains.push_back(Store); 04099 DstOff += VTSize; 04100 } 04101 04102 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 04103 } 04104 04105 /// \brief Lower the call to 'memset' intrinsic function into a series of store 04106 /// operations. 04107 /// 04108 /// \param DAG Selection DAG where lowered code is placed. 04109 /// \param dl Link to corresponding IR location. 04110 /// \param Chain Control flow dependency. 04111 /// \param Dst Pointer to destination memory location. 04112 /// \param Src Value of byte to write into the memory. 04113 /// \param Size Number of bytes to write. 04114 /// \param Align Alignment of the destination in bytes. 04115 /// \param isVol True if destination is volatile. 04116 /// \param DstPtrInfo IR information on the memory pointer. 04117 /// \returns New head in the control flow, if lowering was successful, empty 04118 /// SDValue otherwise. 04119 /// 04120 /// The function tries to replace 'llvm.memset' intrinsic with several store 04121 /// operations and value calculation code. This is usually profitable for small 04122 /// memory size. 04123 static SDValue getMemsetStores(SelectionDAG &DAG, SDLoc dl, 04124 SDValue Chain, SDValue Dst, 04125 SDValue Src, uint64_t Size, 04126 unsigned Align, bool isVol, 04127 MachinePointerInfo DstPtrInfo) { 04128 // Turn a memset of undef to nop. 04129 if (Src.getOpcode() == ISD::UNDEF) 04130 return Chain; 04131 04132 // Expand memset to a series of load/store ops if the size operand 04133 // falls below a certain threshold. 04134 const TargetLowering &TLI = DAG.getTargetLoweringInfo(); 04135 std::vector<EVT> MemOps; 04136 bool DstAlignCanChange = false; 04137 MachineFunction &MF = DAG.getMachineFunction(); 04138 MachineFrameInfo *MFI = MF.getFrameInfo(); 04139 bool OptSize = MF.getFunction()->getAttributes(). 04140 hasAttribute(AttributeSet::FunctionIndex, Attribute::OptimizeForSize); 04141 FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Dst); 04142 if (FI && !MFI->isFixedObjectIndex(FI->getIndex())) 04143 DstAlignCanChange = true; 04144 bool IsZeroVal = 04145 isa<ConstantSDNode>(Src) && cast<ConstantSDNode>(Src)->isNullValue(); 04146 if (!FindOptimalMemOpLowering(MemOps, TLI.getMaxStoresPerMemset(OptSize), 04147 Size, (DstAlignCanChange ? 0 : Align), 0, 04148 true, IsZeroVal, false, true, DAG, TLI)) 04149 return SDValue(); 04150 04151 if (DstAlignCanChange) { 04152 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); 04153 unsigned NewAlign = (unsigned) TLI.getDataLayout()->getABITypeAlignment(Ty); 04154 if (NewAlign > Align) { 04155 // Give the stack frame object a larger alignment if needed. 04156 if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) 04157 MFI->setObjectAlignment(FI->getIndex(), NewAlign); 04158 Align = NewAlign; 04159 } 04160 } 04161 04162 SmallVector<SDValue, 8> OutChains; 04163 uint64_t DstOff = 0; 04164 unsigned NumMemOps = MemOps.size(); 04165 04166 // Find the largest store and generate the bit pattern for it. 04167 EVT LargestVT = MemOps[0]; 04168 for (unsigned i = 1; i < NumMemOps; i++) 04169 if (MemOps[i].bitsGT(LargestVT)) 04170 LargestVT = MemOps[i]; 04171 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl); 04172 04173 for (unsigned i = 0; i < NumMemOps; i++) { 04174 EVT VT = MemOps[i]; 04175 unsigned VTSize = VT.getSizeInBits() / 8; 04176 if (VTSize > Size) { 04177 // Issuing an unaligned load / store pair that overlaps with the previous 04178 // pair. Adjust the offset accordingly. 04179 assert(i == NumMemOps-1 && i != 0); 04180 DstOff -= VTSize - Size; 04181 } 04182 04183 // If this store is smaller than the largest store see whether we can get 04184 // the smaller value for free with a truncate. 04185 SDValue Value = MemSetValue; 04186 if (VT.bitsLT(LargestVT)) { 04187 if (!LargestVT.isVector() && !VT.isVector() && 04188 TLI.isTruncateFree(LargestVT, VT)) 04189 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue); 04190 else 04191 Value = getMemsetValue(Src, VT, DAG, dl); 04192 } 04193 assert(Value.getValueType() == VT && "Value with wrong type."); 04194 SDValue Store = DAG.getStore(Chain, dl, Value, 04195 getMemBasePlusOffset(Dst, DstOff, dl, DAG), 04196 DstPtrInfo.getWithOffset(DstOff), 04197 isVol, false, Align); 04198 OutChains.push_back(Store); 04199 DstOff += VT.getSizeInBits() / 8; 04200 Size -= VTSize; 04201 } 04202 04203 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains); 04204 } 04205 04206 SDValue SelectionDAG::getMemcpy(SDValue Chain, SDLoc dl, SDValue Dst, 04207 SDValue Src, SDValue Size, 04208 unsigned Align, bool isVol, bool AlwaysInline, 04209 MachinePointerInfo DstPtrInfo, 04210 MachinePointerInfo SrcPtrInfo) { 04211 assert(Align && "The SDAG layer expects explicit alignment and reserves 0"); 04212 04213 // Check to see if we should lower the memcpy to loads and stores first. 04214 // For cases within the target-specified limits, this is the best choice. 04215 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size); 04216 if (ConstantSize) { 04217 // Memcpy with size zero? Just return the original chain. 04218 if (ConstantSize->isNullValue()) 04219 return Chain; 04220 04221 SDValue Result = getMemcpyLoadsAndStores(*this, dl, Chain, Dst, Src, 04222 ConstantSize->getZExtValue(),Align, 04223 isVol, false, DstPtrInfo, SrcPtrInfo); 04224 if (Result.getNode()) 04225 return Result; 04226 } 04227 04228 // Then check to see if we should lower the memcpy with target-specific 04229 // code. If the target chooses to do this, this is the next best. 04230 SDValue Result = 04231 TSI->EmitTargetCodeForMemcpy(*this, dl, Chain, Dst, Src, Size, Align, 04232 isVol, AlwaysInline, DstPtrInfo, SrcPtrInfo); 04233 if (Result.getNode()) 04234 return Result; 04235 04236 // If we really need inline code and the target declined to provide it, 04237 // use a (potentially long) sequence of loads and stores. 04238 if (AlwaysInline) { 04239 assert(ConstantSize && "AlwaysInline requires a constant size!"); 04240 return getMemcpyLoadsAndStores(*this, dl, Chain, Dst, Src, 04241 ConstantSize->getZExtValue(), Align, isVol, 04242 true, DstPtrInfo, SrcPtrInfo); 04243 } 04244 04245 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc 04246 // memcpy is not guaranteed to be safe. libc memcpys aren't required to 04247 // respect volatile, so they may do things like read or write memory 04248 // beyond the given memory regions. But fixing this isn't easy, and most 04249 // people don't care. 04250 04251 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 04252 04253 // Emit a library call. 04254 TargetLowering::ArgListTy Args; 04255 TargetLowering::ArgListEntry Entry; 04256 Entry.Ty = TLI->getDataLayout()->getIntPtrType(*getContext()); 04257 Entry.Node = Dst; Args.push_back(Entry); 04258 Entry.Node = Src; Args.push_back(Entry); 04259 Entry.Node = Size; Args.push_back(Entry); 04260 // FIXME: pass in SDLoc 04261 TargetLowering::CallLoweringInfo CLI(*this); 04262 CLI.setDebugLoc(dl).setChain(Chain) 04263 .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY), 04264 Type::getVoidTy(*getContext()), 04265 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY), 04266 TLI->getPointerTy()), std::move(Args), 0) 04267 .setDiscardResult(); 04268 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI); 04269 04270 return CallResult.second; 04271 } 04272 04273 SDValue SelectionDAG::getMemmove(SDValue Chain, SDLoc dl, SDValue Dst, 04274 SDValue Src, SDValue Size, 04275 unsigned Align, bool isVol, 04276 MachinePointerInfo DstPtrInfo, 04277 MachinePointerInfo SrcPtrInfo) { 04278 assert(Align && "The SDAG layer expects explicit alignment and reserves 0"); 04279 04280 // Check to see if we should lower the memmove to loads and stores first. 04281 // For cases within the target-specified limits, this is the best choice. 04282 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size); 04283 if (ConstantSize) { 04284 // Memmove with size zero? Just return the original chain. 04285 if (ConstantSize->isNullValue()) 04286 return Chain; 04287 04288 SDValue Result = 04289 getMemmoveLoadsAndStores(*this, dl, Chain, Dst, Src, 04290 ConstantSize->getZExtValue(), Align, isVol, 04291 false, DstPtrInfo, SrcPtrInfo); 04292 if (Result.getNode()) 04293 return Result; 04294 } 04295 04296 // Then check to see if we should lower the memmove with target-specific 04297 // code. If the target chooses to do this, this is the next best. 04298 SDValue Result = TSI->EmitTargetCodeForMemmove( 04299 *this, dl, Chain, Dst, Src, Size, Align, isVol, DstPtrInfo, SrcPtrInfo); 04300 if (Result.getNode()) 04301 return Result; 04302 04303 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may 04304 // not be safe. See memcpy above for more details. 04305 04306 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 04307 04308 // Emit a library call. 04309 TargetLowering::ArgListTy Args; 04310 TargetLowering::ArgListEntry Entry; 04311 Entry.Ty = TLI->getDataLayout()->getIntPtrType(*getContext()); 04312 Entry.Node = Dst; Args.push_back(Entry); 04313 Entry.Node = Src; Args.push_back(Entry); 04314 Entry.Node = Size; Args.push_back(Entry); 04315 // FIXME: pass in SDLoc 04316 TargetLowering::CallLoweringInfo CLI(*this); 04317 CLI.setDebugLoc(dl).setChain(Chain) 04318 .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE), 04319 Type::getVoidTy(*getContext()), 04320 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE), 04321 TLI->getPointerTy()), std::move(Args), 0) 04322 .setDiscardResult(); 04323 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI); 04324 04325 return CallResult.second; 04326 } 04327 04328 SDValue SelectionDAG::getMemset(SDValue Chain, SDLoc dl, SDValue Dst, 04329 SDValue Src, SDValue Size, 04330 unsigned Align, bool isVol, 04331 MachinePointerInfo DstPtrInfo) { 04332 assert(Align && "The SDAG layer expects explicit alignment and reserves 0"); 04333 04334 // Check to see if we should lower the memset to stores first. 04335 // For cases within the target-specified limits, this is the best choice. 04336 ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size); 04337 if (ConstantSize) { 04338 // Memset with size zero? Just return the original chain. 04339 if (ConstantSize->isNullValue()) 04340 return Chain; 04341 04342 SDValue Result = 04343 getMemsetStores(*this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), 04344 Align, isVol, DstPtrInfo); 04345 04346 if (Result.getNode()) 04347 return Result; 04348 } 04349 04350 // Then check to see if we should lower the memset with target-specific 04351 // code. If the target chooses to do this, this is the next best. 04352 SDValue Result = TSI->EmitTargetCodeForMemset(*this, dl, Chain, Dst, Src, 04353 Size, Align, isVol, DstPtrInfo); 04354 if (Result.getNode()) 04355 return Result; 04356 04357 // Emit a library call. 04358 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 04359 Type *IntPtrTy = TLI->getDataLayout()->getIntPtrType(*getContext()); 04360 TargetLowering::ArgListTy Args; 04361 TargetLowering::ArgListEntry Entry; 04362 Entry.Node = Dst; Entry.Ty = IntPtrTy; 04363 Args.push_back(Entry); 04364 Entry.Node = Src; 04365 Entry.Ty = Src.getValueType().getTypeForEVT(*getContext()); 04366 Args.push_back(Entry); 04367 Entry.Node = Size; 04368 Entry.Ty = IntPtrTy; 04369 Args.push_back(Entry); 04370 04371 // FIXME: pass in SDLoc 04372 TargetLowering::CallLoweringInfo CLI(*this); 04373 CLI.setDebugLoc(dl).setChain(Chain) 04374 .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET), 04375 Type::getVoidTy(*getContext()), 04376 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET), 04377 TLI->getPointerTy()), std::move(Args), 0) 04378 .setDiscardResult(); 04379 04380 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI); 04381 return CallResult.second; 04382 } 04383 04384 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 04385 SDVTList VTList, ArrayRef<SDValue> Ops, 04386 MachineMemOperand *MMO, 04387 AtomicOrdering SuccessOrdering, 04388 AtomicOrdering FailureOrdering, 04389 SynchronizationScope SynchScope) { 04390 FoldingSetNodeID ID; 04391 ID.AddInteger(MemVT.getRawBits()); 04392 AddNodeIDNode(ID, Opcode, VTList, Ops); 04393 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 04394 void* IP = nullptr; 04395 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { 04396 cast<AtomicSDNode>(E)->refineAlignment(MMO); 04397 return SDValue(E, 0); 04398 } 04399 04400 // Allocate the operands array for the node out of the BumpPtrAllocator, since 04401 // SDNode doesn't have access to it. This memory will be "leaked" when 04402 // the node is deallocated, but recovered when the allocator is released. 04403 // If the number of operands is less than 5 we use AtomicSDNode's internal 04404 // storage. 04405 unsigned NumOps = Ops.size(); 04406 SDUse *DynOps = NumOps > 4 ? OperandAllocator.Allocate<SDUse>(NumOps) 04407 : nullptr; 04408 04409 SDNode *N = new (NodeAllocator) AtomicSDNode(Opcode, dl.getIROrder(), 04410 dl.getDebugLoc(), VTList, MemVT, 04411 Ops.data(), DynOps, NumOps, MMO, 04412 SuccessOrdering, FailureOrdering, 04413 SynchScope); 04414 CSEMap.InsertNode(N, IP); 04415 InsertNode(N); 04416 return SDValue(N, 0); 04417 } 04418 04419 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 04420 SDVTList VTList, ArrayRef<SDValue> Ops, 04421 MachineMemOperand *MMO, 04422 AtomicOrdering Ordering, 04423 SynchronizationScope SynchScope) { 04424 return getAtomic(Opcode, dl, MemVT, VTList, Ops, MMO, Ordering, 04425 Ordering, SynchScope); 04426 } 04427 04428 SDValue SelectionDAG::getAtomicCmpSwap( 04429 unsigned Opcode, SDLoc dl, EVT MemVT, SDVTList VTs, SDValue Chain, 04430 SDValue Ptr, SDValue Cmp, SDValue Swp, MachinePointerInfo PtrInfo, 04431 unsigned Alignment, AtomicOrdering SuccessOrdering, 04432 AtomicOrdering FailureOrdering, SynchronizationScope SynchScope) { 04433 assert(Opcode == ISD::ATOMIC_CMP_SWAP || 04434 Opcode == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS); 04435 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types"); 04436 04437 if (Alignment == 0) // Ensure that codegen never sees alignment 0 04438 Alignment = getEVTAlignment(MemVT); 04439 04440 MachineFunction &MF = getMachineFunction(); 04441 04442 // FIXME: Volatile isn't really correct; we should keep track of atomic 04443 // orderings in the memoperand. 04444 unsigned Flags = MachineMemOperand::MOVolatile; 04445 Flags |= MachineMemOperand::MOLoad; 04446 Flags |= MachineMemOperand::MOStore; 04447 04448 MachineMemOperand *MMO = 04449 MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment); 04450 04451 return getAtomicCmpSwap(Opcode, dl, MemVT, VTs, Chain, Ptr, Cmp, Swp, MMO, 04452 SuccessOrdering, FailureOrdering, SynchScope); 04453 } 04454 04455 SDValue SelectionDAG::getAtomicCmpSwap(unsigned Opcode, SDLoc dl, EVT MemVT, 04456 SDVTList VTs, SDValue Chain, SDValue Ptr, 04457 SDValue Cmp, SDValue Swp, 04458 MachineMemOperand *MMO, 04459 AtomicOrdering SuccessOrdering, 04460 AtomicOrdering FailureOrdering, 04461 SynchronizationScope SynchScope) { 04462 assert(Opcode == ISD::ATOMIC_CMP_SWAP || 04463 Opcode == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS); 04464 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types"); 04465 04466 SDValue Ops[] = {Chain, Ptr, Cmp, Swp}; 04467 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO, 04468 SuccessOrdering, FailureOrdering, SynchScope); 04469 } 04470 04471 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 04472 SDValue Chain, 04473 SDValue Ptr, SDValue Val, 04474 const Value* PtrVal, 04475 unsigned Alignment, 04476 AtomicOrdering Ordering, 04477 SynchronizationScope SynchScope) { 04478 if (Alignment == 0) // Ensure that codegen never sees alignment 0 04479 Alignment = getEVTAlignment(MemVT); 04480 04481 MachineFunction &MF = getMachineFunction(); 04482 // An atomic store does not load. An atomic load does not store. 04483 // (An atomicrmw obviously both loads and stores.) 04484 // For now, atomics are considered to be volatile always, and they are 04485 // chained as such. 04486 // FIXME: Volatile isn't really correct; we should keep track of atomic 04487 // orderings in the memoperand. 04488 unsigned Flags = MachineMemOperand::MOVolatile; 04489 if (Opcode != ISD::ATOMIC_STORE) 04490 Flags |= MachineMemOperand::MOLoad; 04491 if (Opcode != ISD::ATOMIC_LOAD) 04492 Flags |= MachineMemOperand::MOStore; 04493 04494 MachineMemOperand *MMO = 04495 MF.getMachineMemOperand(MachinePointerInfo(PtrVal), Flags, 04496 MemVT.getStoreSize(), Alignment); 04497 04498 return getAtomic(Opcode, dl, MemVT, Chain, Ptr, Val, MMO, 04499 Ordering, SynchScope); 04500 } 04501 04502 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 04503 SDValue Chain, 04504 SDValue Ptr, SDValue Val, 04505 MachineMemOperand *MMO, 04506 AtomicOrdering Ordering, 04507 SynchronizationScope SynchScope) { 04508 assert((Opcode == ISD::ATOMIC_LOAD_ADD || 04509 Opcode == ISD::ATOMIC_LOAD_SUB || 04510 Opcode == ISD::ATOMIC_LOAD_AND || 04511 Opcode == ISD::ATOMIC_LOAD_OR || 04512 Opcode == ISD::ATOMIC_LOAD_XOR || 04513 Opcode == ISD::ATOMIC_LOAD_NAND || 04514 Opcode == ISD::ATOMIC_LOAD_MIN || 04515 Opcode == ISD::ATOMIC_LOAD_MAX || 04516 Opcode == ISD::ATOMIC_LOAD_UMIN || 04517 Opcode == ISD::ATOMIC_LOAD_UMAX || 04518 Opcode == ISD::ATOMIC_SWAP || 04519 Opcode == ISD::ATOMIC_STORE) && 04520 "Invalid Atomic Op"); 04521 04522 EVT VT = Val.getValueType(); 04523 04524 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) : 04525 getVTList(VT, MVT::Other); 04526 SDValue Ops[] = {Chain, Ptr, Val}; 04527 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO, Ordering, SynchScope); 04528 } 04529 04530 SDValue SelectionDAG::getAtomic(unsigned Opcode, SDLoc dl, EVT MemVT, 04531 EVT VT, SDValue Chain, 04532 SDValue Ptr, 04533 MachineMemOperand *MMO, 04534 AtomicOrdering Ordering, 04535 SynchronizationScope SynchScope) { 04536 assert(Opcode == ISD::ATOMIC_LOAD && "Invalid Atomic Op"); 04537 04538 SDVTList VTs = getVTList(VT, MVT::Other); 04539 SDValue Ops[] = {Chain, Ptr}; 04540 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO, Ordering, SynchScope); 04541 } 04542 04543 /// getMergeValues - Create a MERGE_VALUES node from the given operands. 04544 SDValue SelectionDAG::getMergeValues(ArrayRef<SDValue> Ops, SDLoc dl) { 04545 if (Ops.size() == 1) 04546 return Ops[0]; 04547 04548 SmallVector<EVT, 4> VTs; 04549 VTs.reserve(Ops.size()); 04550 for (unsigned i = 0; i < Ops.size(); ++i) 04551 VTs.push_back(Ops[i].getValueType()); 04552 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops); 04553 } 04554 04555 SDValue 04556 SelectionDAG::getMemIntrinsicNode(unsigned Opcode, SDLoc dl, SDVTList VTList, 04557 ArrayRef<SDValue> Ops, 04558 EVT MemVT, MachinePointerInfo PtrInfo, 04559 unsigned Align, bool Vol, 04560 bool ReadMem, bool WriteMem, unsigned Size) { 04561 if (Align == 0) // Ensure that codegen never sees alignment 0 04562 Align = getEVTAlignment(MemVT); 04563 04564 MachineFunction &MF = getMachineFunction(); 04565 unsigned Flags = 0; 04566 if (WriteMem) 04567 Flags |= MachineMemOperand::MOStore; 04568 if (ReadMem) 04569 Flags |= MachineMemOperand::MOLoad; 04570 if (Vol) 04571 Flags |= MachineMemOperand::MOVolatile; 04572 if (!Size) 04573 Size = MemVT.getStoreSize(); 04574 MachineMemOperand *MMO = 04575 MF.getMachineMemOperand(PtrInfo, Flags, Size, Align); 04576 04577 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO); 04578 } 04579 04580 SDValue 04581 SelectionDAG::getMemIntrinsicNode(unsigned Opcode, SDLoc dl, SDVTList VTList, 04582 ArrayRef<SDValue> Ops, EVT MemVT, 04583 MachineMemOperand *MMO) { 04584 assert((Opcode == ISD::INTRINSIC_VOID || 04585 Opcode == ISD::INTRINSIC_W_CHAIN || 04586 Opcode == ISD::PREFETCH || 04587 Opcode == ISD::LIFETIME_START || 04588 Opcode == ISD::LIFETIME_END || 04589 (Opcode <= INT_MAX && 04590 (int)Opcode >= ISD::FIRST_TARGET_MEMORY_OPCODE)) && 04591 "Opcode is not a memory-accessing opcode!"); 04592 04593 // Memoize the node unless it returns a flag. 04594 MemIntrinsicSDNode *N; 04595 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) { 04596 FoldingSetNodeID ID; 04597 AddNodeIDNode(ID, Opcode, VTList, Ops); 04598 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 04599 void *IP = nullptr; 04600 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { 04601 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMO); 04602 return SDValue(E, 0); 04603 } 04604 04605 N = new (NodeAllocator) MemIntrinsicSDNode(Opcode, dl.getIROrder(), 04606 dl.getDebugLoc(), VTList, Ops, 04607 MemVT, MMO); 04608 CSEMap.InsertNode(N, IP); 04609 } else { 04610 N = new (NodeAllocator) MemIntrinsicSDNode(Opcode, dl.getIROrder(), 04611 dl.getDebugLoc(), VTList, Ops, 04612 MemVT, MMO); 04613 } 04614 InsertNode(N); 04615 return SDValue(N, 0); 04616 } 04617 04618 /// InferPointerInfo - If the specified ptr/offset is a frame index, infer a 04619 /// MachinePointerInfo record from it. This is particularly useful because the 04620 /// code generator has many cases where it doesn't bother passing in a 04621 /// MachinePointerInfo to getLoad or getStore when it has "FI+Cst". 04622 static MachinePointerInfo InferPointerInfo(SDValue Ptr, int64_t Offset = 0) { 04623 // If this is FI+Offset, we can model it. 04624 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) 04625 return MachinePointerInfo::getFixedStack(FI->getIndex(), Offset); 04626 04627 // If this is (FI+Offset1)+Offset2, we can model it. 04628 if (Ptr.getOpcode() != ISD::ADD || 04629 !isa<ConstantSDNode>(Ptr.getOperand(1)) || 04630 !isa<FrameIndexSDNode>(Ptr.getOperand(0))) 04631 return MachinePointerInfo(); 04632 04633 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex(); 04634 return MachinePointerInfo::getFixedStack(FI, Offset+ 04635 cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue()); 04636 } 04637 04638 /// InferPointerInfo - If the specified ptr/offset is a frame index, infer a 04639 /// MachinePointerInfo record from it. This is particularly useful because the 04640 /// code generator has many cases where it doesn't bother passing in a 04641 /// MachinePointerInfo to getLoad or getStore when it has "FI+Cst". 04642 static MachinePointerInfo InferPointerInfo(SDValue Ptr, SDValue OffsetOp) { 04643 // If the 'Offset' value isn't a constant, we can't handle this. 04644 if (ConstantSDNode *OffsetNode = dyn_cast<ConstantSDNode>(OffsetOp)) 04645 return InferPointerInfo(Ptr, OffsetNode->getSExtValue()); 04646 if (OffsetOp.getOpcode() == ISD::UNDEF) 04647 return InferPointerInfo(Ptr); 04648 return MachinePointerInfo(); 04649 } 04650 04651 04652 SDValue 04653 SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, 04654 EVT VT, SDLoc dl, SDValue Chain, 04655 SDValue Ptr, SDValue Offset, 04656 MachinePointerInfo PtrInfo, EVT MemVT, 04657 bool isVolatile, bool isNonTemporal, bool isInvariant, 04658 unsigned Alignment, const AAMDNodes &AAInfo, 04659 const MDNode *Ranges) { 04660 assert(Chain.getValueType() == MVT::Other && 04661 "Invalid chain type"); 04662 if (Alignment == 0) // Ensure that codegen never sees alignment 0 04663 Alignment = getEVTAlignment(VT); 04664 04665 unsigned Flags = MachineMemOperand::MOLoad; 04666 if (isVolatile) 04667 Flags |= MachineMemOperand::MOVolatile; 04668 if (isNonTemporal) 04669 Flags |= MachineMemOperand::MONonTemporal; 04670 if (isInvariant) 04671 Flags |= MachineMemOperand::MOInvariant; 04672 04673 // If we don't have a PtrInfo, infer the trivial frame index case to simplify 04674 // clients. 04675 if (PtrInfo.V.isNull()) 04676 PtrInfo = InferPointerInfo(Ptr, Offset); 04677 04678 MachineFunction &MF = getMachineFunction(); 04679 MachineMemOperand *MMO = 04680 MF.getMachineMemOperand(PtrInfo, Flags, MemVT.getStoreSize(), Alignment, 04681 AAInfo, Ranges); 04682 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO); 04683 } 04684 04685 SDValue 04686 SelectionDAG::getLoad(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, 04687 EVT VT, SDLoc dl, SDValue Chain, 04688 SDValue Ptr, SDValue Offset, EVT MemVT, 04689 MachineMemOperand *MMO) { 04690 if (VT == MemVT) { 04691 ExtType = ISD::NON_EXTLOAD; 04692 } else if (ExtType == ISD::NON_EXTLOAD) { 04693 assert(VT == MemVT && "Non-extending load from different memory type!"); 04694 } else { 04695 // Extending load. 04696 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) && 04697 "Should only be an extending load, not truncating!"); 04698 assert(VT.isInteger() == MemVT.isInteger() && 04699 "Cannot convert from FP to Int or Int -> FP!"); 04700 assert(VT.isVector() == MemVT.isVector() && 04701 "Cannot use trunc store to convert to or from a vector!"); 04702 assert((!VT.isVector() || 04703 VT.getVectorNumElements() == MemVT.getVectorNumElements()) && 04704 "Cannot use trunc store to change the number of vector elements!"); 04705 } 04706 04707 bool Indexed = AM != ISD::UNINDEXED; 04708 assert((Indexed || Offset.getOpcode() == ISD::UNDEF) && 04709 "Unindexed load with an offset!"); 04710 04711 SDVTList VTs = Indexed ? 04712 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other); 04713 SDValue Ops[] = { Chain, Ptr, Offset }; 04714 FoldingSetNodeID ID; 04715 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops); 04716 ID.AddInteger(MemVT.getRawBits()); 04717 ID.AddInteger(encodeMemSDNodeFlags(ExtType, AM, MMO->isVolatile(), 04718 MMO->isNonTemporal(), 04719 MMO->isInvariant())); 04720 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 04721 void *IP = nullptr; 04722 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { 04723 cast<LoadSDNode>(E)->refineAlignment(MMO); 04724 return SDValue(E, 0); 04725 } 04726 SDNode *N = new (NodeAllocator) LoadSDNode(Ops, dl.getIROrder(), 04727 dl.getDebugLoc(), VTs, AM, ExtType, 04728 MemVT, MMO); 04729 CSEMap.InsertNode(N, IP); 04730 InsertNode(N); 04731 return SDValue(N, 0); 04732 } 04733 04734 SDValue SelectionDAG::getLoad(EVT VT, SDLoc dl, 04735 SDValue Chain, SDValue Ptr, 04736 MachinePointerInfo PtrInfo, 04737 bool isVolatile, bool isNonTemporal, 04738 bool isInvariant, unsigned Alignment, 04739 const AAMDNodes &AAInfo, 04740 const MDNode *Ranges) { 04741 SDValue Undef = getUNDEF(Ptr.getValueType()); 04742 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef, 04743 PtrInfo, VT, isVolatile, isNonTemporal, isInvariant, Alignment, 04744 AAInfo, Ranges); 04745 } 04746 04747 SDValue SelectionDAG::getLoad(EVT VT, SDLoc dl, 04748 SDValue Chain, SDValue Ptr, 04749 MachineMemOperand *MMO) { 04750 SDValue Undef = getUNDEF(Ptr.getValueType()); 04751 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef, 04752 VT, MMO); 04753 } 04754 04755 SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT, 04756 SDValue Chain, SDValue Ptr, 04757 MachinePointerInfo PtrInfo, EVT MemVT, 04758 bool isVolatile, bool isNonTemporal, 04759 bool isInvariant, unsigned Alignment, 04760 const AAMDNodes &AAInfo) { 04761 SDValue Undef = getUNDEF(Ptr.getValueType()); 04762 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, 04763 PtrInfo, MemVT, isVolatile, isNonTemporal, isInvariant, 04764 Alignment, AAInfo); 04765 } 04766 04767 04768 SDValue SelectionDAG::getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT, 04769 SDValue Chain, SDValue Ptr, EVT MemVT, 04770 MachineMemOperand *MMO) { 04771 SDValue Undef = getUNDEF(Ptr.getValueType()); 04772 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, 04773 MemVT, MMO); 04774 } 04775 04776 SDValue 04777 SelectionDAG::getIndexedLoad(SDValue OrigLoad, SDLoc dl, SDValue Base, 04778 SDValue Offset, ISD::MemIndexedMode AM) { 04779 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad); 04780 assert(LD->getOffset().getOpcode() == ISD::UNDEF && 04781 "Load is already a indexed load!"); 04782 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl, 04783 LD->getChain(), Base, Offset, LD->getPointerInfo(), 04784 LD->getMemoryVT(), LD->isVolatile(), LD->isNonTemporal(), 04785 false, LD->getAlignment()); 04786 } 04787 04788 SDValue SelectionDAG::getStore(SDValue Chain, SDLoc dl, SDValue Val, 04789 SDValue Ptr, MachinePointerInfo PtrInfo, 04790 bool isVolatile, bool isNonTemporal, 04791 unsigned Alignment, const AAMDNodes &AAInfo) { 04792 assert(Chain.getValueType() == MVT::Other && 04793 "Invalid chain type"); 04794 if (Alignment == 0) // Ensure that codegen never sees alignment 0 04795 Alignment = getEVTAlignment(Val.getValueType()); 04796 04797 unsigned Flags = MachineMemOperand::MOStore; 04798 if (isVolatile) 04799 Flags |= MachineMemOperand::MOVolatile; 04800 if (isNonTemporal) 04801 Flags |= MachineMemOperand::MONonTemporal; 04802 04803 if (PtrInfo.V.isNull()) 04804 PtrInfo = InferPointerInfo(Ptr); 04805 04806 MachineFunction &MF = getMachineFunction(); 04807 MachineMemOperand *MMO = 04808 MF.getMachineMemOperand(PtrInfo, Flags, 04809 Val.getValueType().getStoreSize(), Alignment, 04810 AAInfo); 04811 04812 return getStore(Chain, dl, Val, Ptr, MMO); 04813 } 04814 04815 SDValue SelectionDAG::getStore(SDValue Chain, SDLoc dl, SDValue Val, 04816 SDValue Ptr, MachineMemOperand *MMO) { 04817 assert(Chain.getValueType() == MVT::Other && 04818 "Invalid chain type"); 04819 EVT VT = Val.getValueType(); 04820 SDVTList VTs = getVTList(MVT::Other); 04821 SDValue Undef = getUNDEF(Ptr.getValueType()); 04822 SDValue Ops[] = { Chain, Val, Ptr, Undef }; 04823 FoldingSetNodeID ID; 04824 AddNodeIDNode(ID, ISD::STORE, VTs, Ops); 04825 ID.AddInteger(VT.getRawBits()); 04826 ID.AddInteger(encodeMemSDNodeFlags(false, ISD::UNINDEXED, MMO->isVolatile(), 04827 MMO->isNonTemporal(), MMO->isInvariant())); 04828 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 04829 void *IP = nullptr; 04830 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { 04831 cast<StoreSDNode>(E)->refineAlignment(MMO); 04832 return SDValue(E, 0); 04833 } 04834 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl.getIROrder(), 04835 dl.getDebugLoc(), VTs, 04836 ISD::UNINDEXED, false, VT, MMO); 04837 CSEMap.InsertNode(N, IP); 04838 InsertNode(N); 04839 return SDValue(N, 0); 04840 } 04841 04842 SDValue SelectionDAG::getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, 04843 SDValue Ptr, MachinePointerInfo PtrInfo, 04844 EVT SVT,bool isVolatile, bool isNonTemporal, 04845 unsigned Alignment, 04846 const AAMDNodes &AAInfo) { 04847 assert(Chain.getValueType() == MVT::Other && 04848 "Invalid chain type"); 04849 if (Alignment == 0) // Ensure that codegen never sees alignment 0 04850 Alignment = getEVTAlignment(SVT); 04851 04852 unsigned Flags = MachineMemOperand::MOStore; 04853 if (isVolatile) 04854 Flags |= MachineMemOperand::MOVolatile; 04855 if (isNonTemporal) 04856 Flags |= MachineMemOperand::MONonTemporal; 04857 04858 if (PtrInfo.V.isNull()) 04859 PtrInfo = InferPointerInfo(Ptr); 04860 04861 MachineFunction &MF = getMachineFunction(); 04862 MachineMemOperand *MMO = 04863 MF.getMachineMemOperand(PtrInfo, Flags, SVT.getStoreSize(), Alignment, 04864 AAInfo); 04865 04866 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO); 04867 } 04868 04869 SDValue SelectionDAG::getTruncStore(SDValue Chain, SDLoc dl, SDValue Val, 04870 SDValue Ptr, EVT SVT, 04871 MachineMemOperand *MMO) { 04872 EVT VT = Val.getValueType(); 04873 04874 assert(Chain.getValueType() == MVT::Other && 04875 "Invalid chain type"); 04876 if (VT == SVT) 04877 return getStore(Chain, dl, Val, Ptr, MMO); 04878 04879 assert(SVT.getScalarType().bitsLT(VT.getScalarType()) && 04880 "Should only be a truncating store, not extending!"); 04881 assert(VT.isInteger() == SVT.isInteger() && 04882 "Can't do FP-INT conversion!"); 04883 assert(VT.isVector() == SVT.isVector() && 04884 "Cannot use trunc store to convert to or from a vector!"); 04885 assert((!VT.isVector() || 04886 VT.getVectorNumElements() == SVT.getVectorNumElements()) && 04887 "Cannot use trunc store to change the number of vector elements!"); 04888 04889 SDVTList VTs = getVTList(MVT::Other); 04890 SDValue Undef = getUNDEF(Ptr.getValueType()); 04891 SDValue Ops[] = { Chain, Val, Ptr, Undef }; 04892 FoldingSetNodeID ID; 04893 AddNodeIDNode(ID, ISD::STORE, VTs, Ops); 04894 ID.AddInteger(SVT.getRawBits()); 04895 ID.AddInteger(encodeMemSDNodeFlags(true, ISD::UNINDEXED, MMO->isVolatile(), 04896 MMO->isNonTemporal(), MMO->isInvariant())); 04897 ID.AddInteger(MMO->getPointerInfo().getAddrSpace()); 04898 void *IP = nullptr; 04899 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { 04900 cast<StoreSDNode>(E)->refineAlignment(MMO); 04901 return SDValue(E, 0); 04902 } 04903 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl.getIROrder(), 04904 dl.getDebugLoc(), VTs, 04905 ISD::UNINDEXED, true, SVT, MMO); 04906 CSEMap.InsertNode(N, IP); 04907 InsertNode(N); 04908 return SDValue(N, 0); 04909 } 04910 04911 SDValue 04912 SelectionDAG::getIndexedStore(SDValue OrigStore, SDLoc dl, SDValue Base, 04913 SDValue Offset, ISD::MemIndexedMode AM) { 04914 StoreSDNode *ST = cast<StoreSDNode>(OrigStore); 04915 assert(ST->getOffset().getOpcode() == ISD::UNDEF && 04916 "Store is already a indexed store!"); 04917 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other); 04918 SDValue Ops[] = { ST->getChain(), ST->getValue(), Base, Offset }; 04919 FoldingSetNodeID ID; 04920 AddNodeIDNode(ID, ISD::STORE, VTs, Ops); 04921 ID.AddInteger(ST->getMemoryVT().getRawBits()); 04922 ID.AddInteger(ST->getRawSubclassData()); 04923 ID.AddInteger(ST->getPointerInfo().getAddrSpace()); 04924 void *IP = nullptr; 04925 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 04926 return SDValue(E, 0); 04927 04928 SDNode *N = new (NodeAllocator) StoreSDNode(Ops, dl.getIROrder(), 04929 dl.getDebugLoc(), VTs, AM, 04930 ST->isTruncatingStore(), 04931 ST->getMemoryVT(), 04932 ST->getMemOperand()); 04933 CSEMap.InsertNode(N, IP); 04934 InsertNode(N); 04935 return SDValue(N, 0); 04936 } 04937 04938 SDValue SelectionDAG::getVAArg(EVT VT, SDLoc dl, 04939 SDValue Chain, SDValue Ptr, 04940 SDValue SV, 04941 unsigned Align) { 04942 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, MVT::i32) }; 04943 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops); 04944 } 04945 04946 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 04947 ArrayRef<SDUse> Ops) { 04948 switch (Ops.size()) { 04949 case 0: return getNode(Opcode, DL, VT); 04950 case 1: return getNode(Opcode, DL, VT, static_cast<const SDValue>(Ops[0])); 04951 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]); 04952 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]); 04953 default: break; 04954 } 04955 04956 // Copy from an SDUse array into an SDValue array for use with 04957 // the regular getNode logic. 04958 SmallVector<SDValue, 8> NewOps(Ops.begin(), Ops.end()); 04959 return getNode(Opcode, DL, VT, NewOps); 04960 } 04961 04962 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, 04963 ArrayRef<SDValue> Ops) { 04964 unsigned NumOps = Ops.size(); 04965 switch (NumOps) { 04966 case 0: return getNode(Opcode, DL, VT); 04967 case 1: return getNode(Opcode, DL, VT, Ops[0]); 04968 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]); 04969 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]); 04970 default: break; 04971 } 04972 04973 switch (Opcode) { 04974 default: break; 04975 case ISD::SELECT_CC: { 04976 assert(NumOps == 5 && "SELECT_CC takes 5 operands!"); 04977 assert(Ops[0].getValueType() == Ops[1].getValueType() && 04978 "LHS and RHS of condition must have same type!"); 04979 assert(Ops[2].getValueType() == Ops[3].getValueType() && 04980 "True and False arms of SelectCC must have same type!"); 04981 assert(Ops[2].getValueType() == VT && 04982 "select_cc node must be of same type as true and false value!"); 04983 break; 04984 } 04985 case ISD::BR_CC: { 04986 assert(NumOps == 5 && "BR_CC takes 5 operands!"); 04987 assert(Ops[2].getValueType() == Ops[3].getValueType() && 04988 "LHS/RHS of comparison should match types!"); 04989 break; 04990 } 04991 } 04992 04993 // Memoize nodes. 04994 SDNode *N; 04995 SDVTList VTs = getVTList(VT); 04996 04997 if (VT != MVT::Glue) { 04998 FoldingSetNodeID ID; 04999 AddNodeIDNode(ID, Opcode, VTs, Ops); 05000 void *IP = nullptr; 05001 05002 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 05003 return SDValue(E, 0); 05004 05005 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 05006 VTs, Ops); 05007 CSEMap.InsertNode(N, IP); 05008 } else { 05009 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 05010 VTs, Ops); 05011 } 05012 05013 InsertNode(N); 05014 return SDValue(N, 0); 05015 } 05016 05017 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, 05018 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) { 05019 return getNode(Opcode, DL, getVTList(ResultTys), Ops); 05020 } 05021 05022 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 05023 ArrayRef<SDValue> Ops) { 05024 if (VTList.NumVTs == 1) 05025 return getNode(Opcode, DL, VTList.VTs[0], Ops); 05026 05027 #if 0 05028 switch (Opcode) { 05029 // FIXME: figure out how to safely handle things like 05030 // int foo(int x) { return 1 << (x & 255); } 05031 // int bar() { return foo(256); } 05032 case ISD::SRA_PARTS: 05033 case ISD::SRL_PARTS: 05034 case ISD::SHL_PARTS: 05035 if (N3.getOpcode() == ISD::SIGN_EXTEND_INREG && 05036 cast<VTSDNode>(N3.getOperand(1))->getVT() != MVT::i1) 05037 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0)); 05038 else if (N3.getOpcode() == ISD::AND) 05039 if (ConstantSDNode *AndRHS = dyn_cast<ConstantSDNode>(N3.getOperand(1))) { 05040 // If the and is only masking out bits that cannot effect the shift, 05041 // eliminate the and. 05042 unsigned NumBits = VT.getScalarType().getSizeInBits()*2; 05043 if ((AndRHS->getValue() & (NumBits-1)) == NumBits-1) 05044 return getNode(Opcode, DL, VT, N1, N2, N3.getOperand(0)); 05045 } 05046 break; 05047 } 05048 #endif 05049 05050 // Memoize the node unless it returns a flag. 05051 SDNode *N; 05052 unsigned NumOps = Ops.size(); 05053 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) { 05054 FoldingSetNodeID ID; 05055 AddNodeIDNode(ID, Opcode, VTList, Ops); 05056 void *IP = nullptr; 05057 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 05058 return SDValue(E, 0); 05059 05060 if (NumOps == 1) { 05061 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 05062 DL.getDebugLoc(), VTList, Ops[0]); 05063 } else if (NumOps == 2) { 05064 N = new (NodeAllocator) BinarySDNode(Opcode, DL.getIROrder(), 05065 DL.getDebugLoc(), VTList, Ops[0], 05066 Ops[1]); 05067 } else if (NumOps == 3) { 05068 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 05069 DL.getDebugLoc(), VTList, Ops[0], 05070 Ops[1], Ops[2]); 05071 } else { 05072 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 05073 VTList, Ops); 05074 } 05075 CSEMap.InsertNode(N, IP); 05076 } else { 05077 if (NumOps == 1) { 05078 N = new (NodeAllocator) UnarySDNode(Opcode, DL.getIROrder(), 05079 DL.getDebugLoc(), VTList, Ops[0]); 05080 } else if (NumOps == 2) { 05081 N = new (NodeAllocator) BinarySDNode(Opcode, DL.getIROrder(), 05082 DL.getDebugLoc(), VTList, Ops[0], 05083 Ops[1]); 05084 } else if (NumOps == 3) { 05085 N = new (NodeAllocator) TernarySDNode(Opcode, DL.getIROrder(), 05086 DL.getDebugLoc(), VTList, Ops[0], 05087 Ops[1], Ops[2]); 05088 } else { 05089 N = new (NodeAllocator) SDNode(Opcode, DL.getIROrder(), DL.getDebugLoc(), 05090 VTList, Ops); 05091 } 05092 } 05093 InsertNode(N); 05094 return SDValue(N, 0); 05095 } 05096 05097 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList) { 05098 return getNode(Opcode, DL, VTList, None); 05099 } 05100 05101 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 05102 SDValue N1) { 05103 SDValue Ops[] = { N1 }; 05104 return getNode(Opcode, DL, VTList, Ops); 05105 } 05106 05107 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 05108 SDValue N1, SDValue N2) { 05109 SDValue Ops[] = { N1, N2 }; 05110 return getNode(Opcode, DL, VTList, Ops); 05111 } 05112 05113 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 05114 SDValue N1, SDValue N2, SDValue N3) { 05115 SDValue Ops[] = { N1, N2, N3 }; 05116 return getNode(Opcode, DL, VTList, Ops); 05117 } 05118 05119 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 05120 SDValue N1, SDValue N2, SDValue N3, 05121 SDValue N4) { 05122 SDValue Ops[] = { N1, N2, N3, N4 }; 05123 return getNode(Opcode, DL, VTList, Ops); 05124 } 05125 05126 SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, SDVTList VTList, 05127 SDValue N1, SDValue N2, SDValue N3, 05128 SDValue N4, SDValue N5) { 05129 SDValue Ops[] = { N1, N2, N3, N4, N5 }; 05130 return getNode(Opcode, DL, VTList, Ops); 05131 } 05132 05133 SDVTList SelectionDAG::getVTList(EVT VT) { 05134 return makeVTList(SDNode::getValueTypeList(VT), 1); 05135 } 05136 05137 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2) { 05138 FoldingSetNodeID ID; 05139 ID.AddInteger(2U); 05140 ID.AddInteger(VT1.getRawBits()); 05141 ID.AddInteger(VT2.getRawBits()); 05142 05143 void *IP = nullptr; 05144 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 05145 if (!Result) { 05146 EVT *Array = Allocator.Allocate<EVT>(2); 05147 Array[0] = VT1; 05148 Array[1] = VT2; 05149 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2); 05150 VTListMap.InsertNode(Result, IP); 05151 } 05152 return Result->getSDVTList(); 05153 } 05154 05155 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2, EVT VT3) { 05156 FoldingSetNodeID ID; 05157 ID.AddInteger(3U); 05158 ID.AddInteger(VT1.getRawBits()); 05159 ID.AddInteger(VT2.getRawBits()); 05160 ID.AddInteger(VT3.getRawBits()); 05161 05162 void *IP = nullptr; 05163 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 05164 if (!Result) { 05165 EVT *Array = Allocator.Allocate<EVT>(3); 05166 Array[0] = VT1; 05167 Array[1] = VT2; 05168 Array[2] = VT3; 05169 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3); 05170 VTListMap.InsertNode(Result, IP); 05171 } 05172 return Result->getSDVTList(); 05173 } 05174 05175 SDVTList SelectionDAG::getVTList(EVT VT1, EVT VT2, EVT VT3, EVT VT4) { 05176 FoldingSetNodeID ID; 05177 ID.AddInteger(4U); 05178 ID.AddInteger(VT1.getRawBits()); 05179 ID.AddInteger(VT2.getRawBits()); 05180 ID.AddInteger(VT3.getRawBits()); 05181 ID.AddInteger(VT4.getRawBits()); 05182 05183 void *IP = nullptr; 05184 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 05185 if (!Result) { 05186 EVT *Array = Allocator.Allocate<EVT>(4); 05187 Array[0] = VT1; 05188 Array[1] = VT2; 05189 Array[2] = VT3; 05190 Array[3] = VT4; 05191 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4); 05192 VTListMap.InsertNode(Result, IP); 05193 } 05194 return Result->getSDVTList(); 05195 } 05196 05197 SDVTList SelectionDAG::getVTList(ArrayRef<EVT> VTs) { 05198 unsigned NumVTs = VTs.size(); 05199 FoldingSetNodeID ID; 05200 ID.AddInteger(NumVTs); 05201 for (unsigned index = 0; index < NumVTs; index++) { 05202 ID.AddInteger(VTs[index].getRawBits()); 05203 } 05204 05205 void *IP = nullptr; 05206 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP); 05207 if (!Result) { 05208 EVT *Array = Allocator.Allocate<EVT>(NumVTs); 05209 std::copy(VTs.begin(), VTs.end(), Array); 05210 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs); 05211 VTListMap.InsertNode(Result, IP); 05212 } 05213 return Result->getSDVTList(); 05214 } 05215 05216 05217 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the 05218 /// specified operands. If the resultant node already exists in the DAG, 05219 /// this does not modify the specified node, instead it returns the node that 05220 /// already exists. If the resultant node does not exist in the DAG, the 05221 /// input node is returned. As a degenerate case, if you specify the same 05222 /// input operands as the node already has, the input node is returned. 05223 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op) { 05224 assert(N->getNumOperands() == 1 && "Update with wrong number of operands"); 05225 05226 // Check to see if there is no change. 05227 if (Op == N->getOperand(0)) return N; 05228 05229 // See if the modified node already exists. 05230 void *InsertPos = nullptr; 05231 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos)) 05232 return Existing; 05233 05234 // Nope it doesn't. Remove the node from its current place in the maps. 05235 if (InsertPos) 05236 if (!RemoveNodeFromCSEMaps(N)) 05237 InsertPos = nullptr; 05238 05239 // Now we update the operands. 05240 N->OperandList[0].set(Op); 05241 05242 // If this gets put into a CSE map, add it. 05243 if (InsertPos) CSEMap.InsertNode(N, InsertPos); 05244 return N; 05245 } 05246 05247 SDNode *SelectionDAG::UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2) { 05248 assert(N->getNumOperands() == 2 && "Update with wrong number of operands"); 05249 05250 // Check to see if there is no change. 05251 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1)) 05252 return N; // No operands changed, just return the input node. 05253 05254 // See if the modified node already exists. 05255 void *InsertPos = nullptr; 05256 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos)) 05257 return Existing; 05258 05259 // Nope it doesn't. Remove the node from its current place in the maps. 05260 if (InsertPos) 05261 if (!RemoveNodeFromCSEMaps(N)) 05262 InsertPos = nullptr; 05263 05264 // Now we update the operands. 05265 if (N->OperandList[0] != Op1) 05266 N->OperandList[0].set(Op1); 05267 if (N->OperandList[1] != Op2) 05268 N->OperandList[1].set(Op2); 05269 05270 // If this gets put into a CSE map, add it. 05271 if (InsertPos) CSEMap.InsertNode(N, InsertPos); 05272 return N; 05273 } 05274 05275 SDNode *SelectionDAG:: 05276 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, SDValue Op3) { 05277 SDValue Ops[] = { Op1, Op2, Op3 }; 05278 return UpdateNodeOperands(N, Ops); 05279 } 05280 05281 SDNode *SelectionDAG:: 05282 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, 05283 SDValue Op3, SDValue Op4) { 05284 SDValue Ops[] = { Op1, Op2, Op3, Op4 }; 05285 return UpdateNodeOperands(N, Ops); 05286 } 05287 05288 SDNode *SelectionDAG:: 05289 UpdateNodeOperands(SDNode *N, SDValue Op1, SDValue Op2, 05290 SDValue Op3, SDValue Op4, SDValue Op5) { 05291 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 }; 05292 return UpdateNodeOperands(N, Ops); 05293 } 05294 05295 SDNode *SelectionDAG:: 05296 UpdateNodeOperands(SDNode *N, ArrayRef<SDValue> Ops) { 05297 unsigned NumOps = Ops.size(); 05298 assert(N->getNumOperands() == NumOps && 05299 "Update with wrong number of operands"); 05300 05301 // Check to see if there is no change. 05302 bool AnyChange = false; 05303 for (unsigned i = 0; i != NumOps; ++i) { 05304 if (Ops[i] != N->getOperand(i)) { 05305 AnyChange = true; 05306 break; 05307 } 05308 } 05309 05310 // No operands changed, just return the input node. 05311 if (!AnyChange) return N; 05312 05313 // See if the modified node already exists. 05314 void *InsertPos = nullptr; 05315 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos)) 05316 return Existing; 05317 05318 // Nope it doesn't. Remove the node from its current place in the maps. 05319 if (InsertPos) 05320 if (!RemoveNodeFromCSEMaps(N)) 05321 InsertPos = nullptr; 05322 05323 // Now we update the operands. 05324 for (unsigned i = 0; i != NumOps; ++i) 05325 if (N->OperandList[i] != Ops[i]) 05326 N->OperandList[i].set(Ops[i]); 05327 05328 // If this gets put into a CSE map, add it. 05329 if (InsertPos) CSEMap.InsertNode(N, InsertPos); 05330 return N; 05331 } 05332 05333 /// DropOperands - Release the operands and set this node to have 05334 /// zero operands. 05335 void SDNode::DropOperands() { 05336 // Unlike the code in MorphNodeTo that does this, we don't need to 05337 // watch for dead nodes here. 05338 for (op_iterator I = op_begin(), E = op_end(); I != E; ) { 05339 SDUse &Use = *I++; 05340 Use.set(SDValue()); 05341 } 05342 } 05343 05344 /// SelectNodeTo - These are wrappers around MorphNodeTo that accept a 05345 /// machine opcode. 05346 /// 05347 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05348 EVT VT) { 05349 SDVTList VTs = getVTList(VT); 05350 return SelectNodeTo(N, MachineOpc, VTs, None); 05351 } 05352 05353 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05354 EVT VT, SDValue Op1) { 05355 SDVTList VTs = getVTList(VT); 05356 SDValue Ops[] = { Op1 }; 05357 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05358 } 05359 05360 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05361 EVT VT, SDValue Op1, 05362 SDValue Op2) { 05363 SDVTList VTs = getVTList(VT); 05364 SDValue Ops[] = { Op1, Op2 }; 05365 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05366 } 05367 05368 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05369 EVT VT, SDValue Op1, 05370 SDValue Op2, SDValue Op3) { 05371 SDVTList VTs = getVTList(VT); 05372 SDValue Ops[] = { Op1, Op2, Op3 }; 05373 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05374 } 05375 05376 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05377 EVT VT, ArrayRef<SDValue> Ops) { 05378 SDVTList VTs = getVTList(VT); 05379 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05380 } 05381 05382 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05383 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) { 05384 SDVTList VTs = getVTList(VT1, VT2); 05385 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05386 } 05387 05388 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05389 EVT VT1, EVT VT2) { 05390 SDVTList VTs = getVTList(VT1, VT2); 05391 return SelectNodeTo(N, MachineOpc, VTs, None); 05392 } 05393 05394 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05395 EVT VT1, EVT VT2, EVT VT3, 05396 ArrayRef<SDValue> Ops) { 05397 SDVTList VTs = getVTList(VT1, VT2, VT3); 05398 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05399 } 05400 05401 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05402 EVT VT1, EVT VT2, EVT VT3, EVT VT4, 05403 ArrayRef<SDValue> Ops) { 05404 SDVTList VTs = getVTList(VT1, VT2, VT3, VT4); 05405 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05406 } 05407 05408 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05409 EVT VT1, EVT VT2, 05410 SDValue Op1) { 05411 SDVTList VTs = getVTList(VT1, VT2); 05412 SDValue Ops[] = { Op1 }; 05413 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05414 } 05415 05416 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05417 EVT VT1, EVT VT2, 05418 SDValue Op1, SDValue Op2) { 05419 SDVTList VTs = getVTList(VT1, VT2); 05420 SDValue Ops[] = { Op1, Op2 }; 05421 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05422 } 05423 05424 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05425 EVT VT1, EVT VT2, 05426 SDValue Op1, SDValue Op2, 05427 SDValue Op3) { 05428 SDVTList VTs = getVTList(VT1, VT2); 05429 SDValue Ops[] = { Op1, Op2, Op3 }; 05430 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05431 } 05432 05433 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05434 EVT VT1, EVT VT2, EVT VT3, 05435 SDValue Op1, SDValue Op2, 05436 SDValue Op3) { 05437 SDVTList VTs = getVTList(VT1, VT2, VT3); 05438 SDValue Ops[] = { Op1, Op2, Op3 }; 05439 return SelectNodeTo(N, MachineOpc, VTs, Ops); 05440 } 05441 05442 SDNode *SelectionDAG::SelectNodeTo(SDNode *N, unsigned MachineOpc, 05443 SDVTList VTs,ArrayRef<SDValue> Ops) { 05444 N = MorphNodeTo(N, ~MachineOpc, VTs, Ops); 05445 // Reset the NodeID to -1. 05446 N->setNodeId(-1); 05447 return N; 05448 } 05449 05450 /// UpdadeSDLocOnMergedSDNode - If the opt level is -O0 then it throws away 05451 /// the line number information on the merged node since it is not possible to 05452 /// preserve the information that operation is associated with multiple lines. 05453 /// This will make the debugger working better at -O0, were there is a higher 05454 /// probability having other instructions associated with that line. 05455 /// 05456 /// For IROrder, we keep the smaller of the two 05457 SDNode *SelectionDAG::UpdadeSDLocOnMergedSDNode(SDNode *N, SDLoc OLoc) { 05458 DebugLoc NLoc = N->getDebugLoc(); 05459 if (!(NLoc.isUnknown()) && (OptLevel == CodeGenOpt::None) && 05460 (OLoc.getDebugLoc() != NLoc)) { 05461 N->setDebugLoc(DebugLoc()); 05462 } 05463 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder()); 05464 N->setIROrder(Order); 05465 return N; 05466 } 05467 05468 /// MorphNodeTo - This *mutates* the specified node to have the specified 05469 /// return type, opcode, and operands. 05470 /// 05471 /// Note that MorphNodeTo returns the resultant node. If there is already a 05472 /// node of the specified opcode and operands, it returns that node instead of 05473 /// the current one. Note that the SDLoc need not be the same. 05474 /// 05475 /// Using MorphNodeTo is faster than creating a new node and swapping it in 05476 /// with ReplaceAllUsesWith both because it often avoids allocating a new 05477 /// node, and because it doesn't require CSE recalculation for any of 05478 /// the node's users. 05479 /// 05480 /// However, note that MorphNodeTo recursively deletes dead nodes from the DAG. 05481 /// As a consequence it isn't appropriate to use from within the DAG combiner or 05482 /// the legalizer which maintain worklists that would need to be updated when 05483 /// deleting things. 05484 SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc, 05485 SDVTList VTs, ArrayRef<SDValue> Ops) { 05486 unsigned NumOps = Ops.size(); 05487 // If an identical node already exists, use it. 05488 void *IP = nullptr; 05489 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) { 05490 FoldingSetNodeID ID; 05491 AddNodeIDNode(ID, Opc, VTs, Ops); 05492 if (SDNode *ON = CSEMap.FindNodeOrInsertPos(ID, IP)) 05493 return UpdadeSDLocOnMergedSDNode(ON, SDLoc(N)); 05494 } 05495 05496 if (!RemoveNodeFromCSEMaps(N)) 05497 IP = nullptr; 05498 05499 // Start the morphing. 05500 N->NodeType = Opc; 05501 N->ValueList = VTs.VTs; 05502 N->NumValues = VTs.NumVTs; 05503 05504 // Clear the operands list, updating used nodes to remove this from their 05505 // use list. Keep track of any operands that become dead as a result. 05506 SmallPtrSet<SDNode*, 16> DeadNodeSet; 05507 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) { 05508 SDUse &Use = *I++; 05509 SDNode *Used = Use.getNode(); 05510 Use.set(SDValue()); 05511 if (Used->use_empty()) 05512 DeadNodeSet.insert(Used); 05513 } 05514 05515 if (MachineSDNode *MN = dyn_cast<MachineSDNode>(N)) { 05516 // Initialize the memory references information. 05517 MN->setMemRefs(nullptr, nullptr); 05518 // If NumOps is larger than the # of operands we can have in a 05519 // MachineSDNode, reallocate the operand list. 05520 if (NumOps > MN->NumOperands || !MN->OperandsNeedDelete) { 05521 if (MN->OperandsNeedDelete) 05522 delete[] MN->OperandList; 05523 if (NumOps > array_lengthof(MN->LocalOperands)) 05524 // We're creating a final node that will live unmorphed for the 05525 // remainder of the current SelectionDAG iteration, so we can allocate 05526 // the operands directly out of a pool with no recycling metadata. 05527 MN->InitOperands(OperandAllocator.Allocate<SDUse>(NumOps), 05528 Ops.data(), NumOps); 05529 else 05530 MN->InitOperands(MN->LocalOperands, Ops.data(), NumOps); 05531 MN->OperandsNeedDelete = false; 05532 } else 05533 MN->InitOperands(MN->OperandList, Ops.data(), NumOps); 05534 } else { 05535 // If NumOps is larger than the # of operands we currently have, reallocate 05536 // the operand list. 05537 if (NumOps > N->NumOperands) { 05538 if (N->OperandsNeedDelete) 05539 delete[] N->OperandList; 05540 N->InitOperands(new SDUse[NumOps], Ops.data(), NumOps); 05541 N->OperandsNeedDelete = true; 05542 } else 05543 N->InitOperands(N->OperandList, Ops.data(), NumOps); 05544 } 05545 05546 // Delete any nodes that are still dead after adding the uses for the 05547 // new operands. 05548 if (!DeadNodeSet.empty()) { 05549 SmallVector<SDNode *, 16> DeadNodes; 05550 for (SDNode *N : DeadNodeSet) 05551 if (N->use_empty()) 05552 DeadNodes.push_back(N); 05553 RemoveDeadNodes(DeadNodes); 05554 } 05555 05556 if (IP) 05557 CSEMap.InsertNode(N, IP); // Memoize the new node. 05558 return N; 05559 } 05560 05561 05562 /// getMachineNode - These are used for target selectors to create a new node 05563 /// with specified return type(s), MachineInstr opcode, and operands. 05564 /// 05565 /// Note that getMachineNode returns the resultant node. If there is already a 05566 /// node of the specified opcode and operands, it returns that node instead of 05567 /// the current one. 05568 MachineSDNode * 05569 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT) { 05570 SDVTList VTs = getVTList(VT); 05571 return getMachineNode(Opcode, dl, VTs, None); 05572 } 05573 05574 MachineSDNode * 05575 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, SDValue Op1) { 05576 SDVTList VTs = getVTList(VT); 05577 SDValue Ops[] = { Op1 }; 05578 return getMachineNode(Opcode, dl, VTs, Ops); 05579 } 05580 05581 MachineSDNode * 05582 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, 05583 SDValue Op1, SDValue Op2) { 05584 SDVTList VTs = getVTList(VT); 05585 SDValue Ops[] = { Op1, Op2 }; 05586 return getMachineNode(Opcode, dl, VTs, Ops); 05587 } 05588 05589 MachineSDNode * 05590 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, 05591 SDValue Op1, SDValue Op2, SDValue Op3) { 05592 SDVTList VTs = getVTList(VT); 05593 SDValue Ops[] = { Op1, Op2, Op3 }; 05594 return getMachineNode(Opcode, dl, VTs, Ops); 05595 } 05596 05597 MachineSDNode * 05598 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT, 05599 ArrayRef<SDValue> Ops) { 05600 SDVTList VTs = getVTList(VT); 05601 return getMachineNode(Opcode, dl, VTs, Ops); 05602 } 05603 05604 MachineSDNode * 05605 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, EVT VT2) { 05606 SDVTList VTs = getVTList(VT1, VT2); 05607 return getMachineNode(Opcode, dl, VTs, None); 05608 } 05609 05610 MachineSDNode * 05611 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05612 EVT VT1, EVT VT2, SDValue Op1) { 05613 SDVTList VTs = getVTList(VT1, VT2); 05614 SDValue Ops[] = { Op1 }; 05615 return getMachineNode(Opcode, dl, VTs, Ops); 05616 } 05617 05618 MachineSDNode * 05619 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05620 EVT VT1, EVT VT2, SDValue Op1, SDValue Op2) { 05621 SDVTList VTs = getVTList(VT1, VT2); 05622 SDValue Ops[] = { Op1, Op2 }; 05623 return getMachineNode(Opcode, dl, VTs, Ops); 05624 } 05625 05626 MachineSDNode * 05627 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05628 EVT VT1, EVT VT2, SDValue Op1, 05629 SDValue Op2, SDValue Op3) { 05630 SDVTList VTs = getVTList(VT1, VT2); 05631 SDValue Ops[] = { Op1, Op2, Op3 }; 05632 return getMachineNode(Opcode, dl, VTs, Ops); 05633 } 05634 05635 MachineSDNode * 05636 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05637 EVT VT1, EVT VT2, 05638 ArrayRef<SDValue> Ops) { 05639 SDVTList VTs = getVTList(VT1, VT2); 05640 return getMachineNode(Opcode, dl, VTs, Ops); 05641 } 05642 05643 MachineSDNode * 05644 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05645 EVT VT1, EVT VT2, EVT VT3, 05646 SDValue Op1, SDValue Op2) { 05647 SDVTList VTs = getVTList(VT1, VT2, VT3); 05648 SDValue Ops[] = { Op1, Op2 }; 05649 return getMachineNode(Opcode, dl, VTs, Ops); 05650 } 05651 05652 MachineSDNode * 05653 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05654 EVT VT1, EVT VT2, EVT VT3, 05655 SDValue Op1, SDValue Op2, SDValue Op3) { 05656 SDVTList VTs = getVTList(VT1, VT2, VT3); 05657 SDValue Ops[] = { Op1, Op2, Op3 }; 05658 return getMachineNode(Opcode, dl, VTs, Ops); 05659 } 05660 05661 MachineSDNode * 05662 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05663 EVT VT1, EVT VT2, EVT VT3, 05664 ArrayRef<SDValue> Ops) { 05665 SDVTList VTs = getVTList(VT1, VT2, VT3); 05666 return getMachineNode(Opcode, dl, VTs, Ops); 05667 } 05668 05669 MachineSDNode * 05670 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, EVT VT1, 05671 EVT VT2, EVT VT3, EVT VT4, 05672 ArrayRef<SDValue> Ops) { 05673 SDVTList VTs = getVTList(VT1, VT2, VT3, VT4); 05674 return getMachineNode(Opcode, dl, VTs, Ops); 05675 } 05676 05677 MachineSDNode * 05678 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc dl, 05679 ArrayRef<EVT> ResultTys, 05680 ArrayRef<SDValue> Ops) { 05681 SDVTList VTs = getVTList(ResultTys); 05682 return getMachineNode(Opcode, dl, VTs, Ops); 05683 } 05684 05685 MachineSDNode * 05686 SelectionDAG::getMachineNode(unsigned Opcode, SDLoc DL, SDVTList VTs, 05687 ArrayRef<SDValue> OpsArray) { 05688 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue; 05689 MachineSDNode *N; 05690 void *IP = nullptr; 05691 const SDValue *Ops = OpsArray.data(); 05692 unsigned NumOps = OpsArray.size(); 05693 05694 if (DoCSE) { 05695 FoldingSetNodeID ID; 05696 AddNodeIDNode(ID, ~Opcode, VTs, OpsArray); 05697 IP = nullptr; 05698 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) { 05699 return cast<MachineSDNode>(UpdadeSDLocOnMergedSDNode(E, DL)); 05700 } 05701 } 05702 05703 // Allocate a new MachineSDNode. 05704 N = new (NodeAllocator) MachineSDNode(~Opcode, DL.getIROrder(), 05705 DL.getDebugLoc(), VTs); 05706 05707 // Initialize the operands list. 05708 if (NumOps > array_lengthof(N->LocalOperands)) 05709 // We're creating a final node that will live unmorphed for the 05710 // remainder of the current SelectionDAG iteration, so we can allocate 05711 // the operands directly out of a pool with no recycling metadata. 05712 N->InitOperands(OperandAllocator.Allocate<SDUse>(NumOps), 05713 Ops, NumOps); 05714 else 05715 N->InitOperands(N->LocalOperands, Ops, NumOps); 05716 N->OperandsNeedDelete = false; 05717 05718 if (DoCSE) 05719 CSEMap.InsertNode(N, IP); 05720 05721 InsertNode(N); 05722 return N; 05723 } 05724 05725 /// getTargetExtractSubreg - A convenience function for creating 05726 /// TargetOpcode::EXTRACT_SUBREG nodes. 05727 SDValue 05728 SelectionDAG::getTargetExtractSubreg(int SRIdx, SDLoc DL, EVT VT, 05729 SDValue Operand) { 05730 SDValue SRIdxVal = getTargetConstant(SRIdx, MVT::i32); 05731 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL, 05732 VT, Operand, SRIdxVal); 05733 return SDValue(Subreg, 0); 05734 } 05735 05736 /// getTargetInsertSubreg - A convenience function for creating 05737 /// TargetOpcode::INSERT_SUBREG nodes. 05738 SDValue 05739 SelectionDAG::getTargetInsertSubreg(int SRIdx, SDLoc DL, EVT VT, 05740 SDValue Operand, SDValue Subreg) { 05741 SDValue SRIdxVal = getTargetConstant(SRIdx, MVT::i32); 05742 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL, 05743 VT, Operand, Subreg, SRIdxVal); 05744 return SDValue(Result, 0); 05745 } 05746 05747 /// getNodeIfExists - Get the specified node if it's already available, or 05748 /// else return NULL. 05749 SDNode *SelectionDAG::getNodeIfExists(unsigned Opcode, SDVTList VTList, 05750 ArrayRef<SDValue> Ops, bool nuw, bool nsw, 05751 bool exact) { 05752 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) { 05753 FoldingSetNodeID ID; 05754 AddNodeIDNode(ID, Opcode, VTList, Ops); 05755 if (isBinOpWithFlags(Opcode)) 05756 AddBinaryNodeIDCustom(ID, nuw, nsw, exact); 05757 void *IP = nullptr; 05758 if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) 05759 return E; 05760 } 05761 return nullptr; 05762 } 05763 05764 /// getDbgValue - Creates a SDDbgValue node. 05765 /// 05766 /// SDNode 05767 SDDbgValue * 05768 SelectionDAG::getDbgValue(MDNode *MDPtr, SDNode *N, unsigned R, 05769 bool IsIndirect, uint64_t Off, 05770 DebugLoc DL, unsigned O) { 05771 return new (Allocator) SDDbgValue(MDPtr, N, R, IsIndirect, Off, DL, O); 05772 } 05773 05774 /// Constant 05775 SDDbgValue * 05776 SelectionDAG::getConstantDbgValue(MDNode *MDPtr, const Value *C, 05777 uint64_t Off, 05778 DebugLoc DL, unsigned O) { 05779 return new (Allocator) SDDbgValue(MDPtr, C, Off, DL, O); 05780 } 05781 05782 /// FrameIndex 05783 SDDbgValue * 05784 SelectionDAG::getFrameIndexDbgValue(MDNode *MDPtr, unsigned FI, uint64_t Off, 05785 DebugLoc DL, unsigned O) { 05786 return new (Allocator) SDDbgValue(MDPtr, FI, Off, DL, O); 05787 } 05788 05789 namespace { 05790 05791 /// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node 05792 /// pointed to by a use iterator is deleted, increment the use iterator 05793 /// so that it doesn't dangle. 05794 /// 05795 class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener { 05796 SDNode::use_iterator &UI; 05797 SDNode::use_iterator &UE; 05798 05799 void NodeDeleted(SDNode *N, SDNode *E) override { 05800 // Increment the iterator as needed. 05801 while (UI != UE && N == *UI) 05802 ++UI; 05803 } 05804 05805 public: 05806 RAUWUpdateListener(SelectionDAG &d, 05807 SDNode::use_iterator &ui, 05808 SDNode::use_iterator &ue) 05809 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {} 05810 }; 05811 05812 } 05813 05814 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 05815 /// This can cause recursive merging of nodes in the DAG. 05816 /// 05817 /// This version assumes From has a single result value. 05818 /// 05819 void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To) { 05820 SDNode *From = FromN.getNode(); 05821 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 && 05822 "Cannot replace with this method!"); 05823 assert(From != To.getNode() && "Cannot replace uses of with self"); 05824 05825 // Iterate over all the existing uses of From. New uses will be added 05826 // to the beginning of the use list, which we avoid visiting. 05827 // This specifically avoids visiting uses of From that arise while the 05828 // replacement is happening, because any such uses would be the result 05829 // of CSE: If an existing node looks like From after one of its operands 05830 // is replaced by To, we don't want to replace of all its users with To 05831 // too. See PR3018 for more info. 05832 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end(); 05833 RAUWUpdateListener Listener(*this, UI, UE); 05834 while (UI != UE) { 05835 SDNode *User = *UI; 05836 05837 // This node is about to morph, remove its old self from the CSE maps. 05838 RemoveNodeFromCSEMaps(User); 05839 05840 // A user can appear in a use list multiple times, and when this 05841 // happens the uses are usually next to each other in the list. 05842 // To help reduce the number of CSE recomputations, process all 05843 // the uses of this user that we can find this way. 05844 do { 05845 SDUse &Use = UI.getUse(); 05846 ++UI; 05847 Use.set(To); 05848 } while (UI != UE && *UI == User); 05849 05850 // Now that we have modified User, add it back to the CSE maps. If it 05851 // already exists there, recursively merge the results together. 05852 AddModifiedNodeToCSEMaps(User); 05853 } 05854 05855 // If we just RAUW'd the root, take note. 05856 if (FromN == getRoot()) 05857 setRoot(To); 05858 } 05859 05860 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 05861 /// This can cause recursive merging of nodes in the DAG. 05862 /// 05863 /// This version assumes that for each value of From, there is a 05864 /// corresponding value in To in the same position with the same type. 05865 /// 05866 void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To) { 05867 #ifndef NDEBUG 05868 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) 05869 assert((!From->hasAnyUseOfValue(i) || 05870 From->getValueType(i) == To->getValueType(i)) && 05871 "Cannot use this version of ReplaceAllUsesWith!"); 05872 #endif 05873 05874 // Handle the trivial case. 05875 if (From == To) 05876 return; 05877 05878 // Iterate over just the existing users of From. See the comments in 05879 // the ReplaceAllUsesWith above. 05880 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end(); 05881 RAUWUpdateListener Listener(*this, UI, UE); 05882 while (UI != UE) { 05883 SDNode *User = *UI; 05884 05885 // This node is about to morph, remove its old self from the CSE maps. 05886 RemoveNodeFromCSEMaps(User); 05887 05888 // A user can appear in a use list multiple times, and when this 05889 // happens the uses are usually next to each other in the list. 05890 // To help reduce the number of CSE recomputations, process all 05891 // the uses of this user that we can find this way. 05892 do { 05893 SDUse &Use = UI.getUse(); 05894 ++UI; 05895 Use.setNode(To); 05896 } while (UI != UE && *UI == User); 05897 05898 // Now that we have modified User, add it back to the CSE maps. If it 05899 // already exists there, recursively merge the results together. 05900 AddModifiedNodeToCSEMaps(User); 05901 } 05902 05903 // If we just RAUW'd the root, take note. 05904 if (From == getRoot().getNode()) 05905 setRoot(SDValue(To, getRoot().getResNo())); 05906 } 05907 05908 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. 05909 /// This can cause recursive merging of nodes in the DAG. 05910 /// 05911 /// This version can replace From with any result values. To must match the 05912 /// number and types of values returned by From. 05913 void SelectionDAG::ReplaceAllUsesWith(SDNode *From, const SDValue *To) { 05914 if (From->getNumValues() == 1) // Handle the simple case efficiently. 05915 return ReplaceAllUsesWith(SDValue(From, 0), To[0]); 05916 05917 // Iterate over just the existing users of From. See the comments in 05918 // the ReplaceAllUsesWith above. 05919 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end(); 05920 RAUWUpdateListener Listener(*this, UI, UE); 05921 while (UI != UE) { 05922 SDNode *User = *UI; 05923 05924 // This node is about to morph, remove its old self from the CSE maps. 05925 RemoveNodeFromCSEMaps(User); 05926 05927 // A user can appear in a use list multiple times, and when this 05928 // happens the uses are usually next to each other in the list. 05929 // To help reduce the number of CSE recomputations, process all 05930 // the uses of this user that we can find this way. 05931 do { 05932 SDUse &Use = UI.getUse(); 05933 const SDValue &ToOp = To[Use.getResNo()]; 05934 ++UI; 05935 Use.set(ToOp); 05936 } while (UI != UE && *UI == User); 05937 05938 // Now that we have modified User, add it back to the CSE maps. If it 05939 // already exists there, recursively merge the results together. 05940 AddModifiedNodeToCSEMaps(User); 05941 } 05942 05943 // If we just RAUW'd the root, take note. 05944 if (From == getRoot().getNode()) 05945 setRoot(SDValue(To[getRoot().getResNo()])); 05946 } 05947 05948 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving 05949 /// uses of other values produced by From.getNode() alone. The Deleted 05950 /// vector is handled the same way as for ReplaceAllUsesWith. 05951 void SelectionDAG::ReplaceAllUsesOfValueWith(SDValue From, SDValue To){ 05952 // Handle the really simple, really trivial case efficiently. 05953 if (From == To) return; 05954 05955 // Handle the simple, trivial, case efficiently. 05956 if (From.getNode()->getNumValues() == 1) { 05957 ReplaceAllUsesWith(From, To); 05958 return; 05959 } 05960 05961 // Iterate over just the existing users of From. See the comments in 05962 // the ReplaceAllUsesWith above. 05963 SDNode::use_iterator UI = From.getNode()->use_begin(), 05964 UE = From.getNode()->use_end(); 05965 RAUWUpdateListener Listener(*this, UI, UE); 05966 while (UI != UE) { 05967 SDNode *User = *UI; 05968 bool UserRemovedFromCSEMaps = false; 05969 05970 // A user can appear in a use list multiple times, and when this 05971 // happens the uses are usually next to each other in the list. 05972 // To help reduce the number of CSE recomputations, process all 05973 // the uses of this user that we can find this way. 05974 do { 05975 SDUse &Use = UI.getUse(); 05976 05977 // Skip uses of different values from the same node. 05978 if (Use.getResNo() != From.getResNo()) { 05979 ++UI; 05980 continue; 05981 } 05982 05983 // If this node hasn't been modified yet, it's still in the CSE maps, 05984 // so remove its old self from the CSE maps. 05985 if (!UserRemovedFromCSEMaps) { 05986 RemoveNodeFromCSEMaps(User); 05987 UserRemovedFromCSEMaps = true; 05988 } 05989 05990 ++UI; 05991 Use.set(To); 05992 } while (UI != UE && *UI == User); 05993 05994 // We are iterating over all uses of the From node, so if a use 05995 // doesn't use the specific value, no changes are made. 05996 if (!UserRemovedFromCSEMaps) 05997 continue; 05998 05999 // Now that we have modified User, add it back to the CSE maps. If it 06000 // already exists there, recursively merge the results together. 06001 AddModifiedNodeToCSEMaps(User); 06002 } 06003 06004 // If we just RAUW'd the root, take note. 06005 if (From == getRoot()) 06006 setRoot(To); 06007 } 06008 06009 namespace { 06010 /// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith 06011 /// to record information about a use. 06012 struct UseMemo { 06013 SDNode *User; 06014 unsigned Index; 06015 SDUse *Use; 06016 }; 06017 06018 /// operator< - Sort Memos by User. 06019 bool operator<(const UseMemo &L, const UseMemo &R) { 06020 return (intptr_t)L.User < (intptr_t)R.User; 06021 } 06022 } 06023 06024 /// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving 06025 /// uses of other values produced by From.getNode() alone. The same value 06026 /// may appear in both the From and To list. The Deleted vector is 06027 /// handled the same way as for ReplaceAllUsesWith. 06028 void SelectionDAG::ReplaceAllUsesOfValuesWith(const SDValue *From, 06029 const SDValue *To, 06030 unsigned Num){ 06031 // Handle the simple, trivial case efficiently. 06032 if (Num == 1) 06033 return ReplaceAllUsesOfValueWith(*From, *To); 06034 06035 // Read up all the uses and make records of them. This helps 06036 // processing new uses that are introduced during the 06037 // replacement process. 06038 SmallVector<UseMemo, 4> Uses; 06039 for (unsigned i = 0; i != Num; ++i) { 06040 unsigned FromResNo = From[i].getResNo(); 06041 SDNode *FromNode = From[i].getNode(); 06042 for (SDNode::use_iterator UI = FromNode->use_begin(), 06043 E = FromNode->use_end(); UI != E; ++UI) { 06044 SDUse &Use = UI.getUse(); 06045 if (Use.getResNo() == FromResNo) { 06046 UseMemo Memo = { *UI, i, &Use }; 06047 Uses.push_back(Memo); 06048 } 06049 } 06050 } 06051 06052 // Sort the uses, so that all the uses from a given User are together. 06053 std::sort(Uses.begin(), Uses.end()); 06054 06055 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size(); 06056 UseIndex != UseIndexEnd; ) { 06057 // We know that this user uses some value of From. If it is the right 06058 // value, update it. 06059 SDNode *User = Uses[UseIndex].User; 06060 06061 // This node is about to morph, remove its old self from the CSE maps. 06062 RemoveNodeFromCSEMaps(User); 06063 06064 // The Uses array is sorted, so all the uses for a given User 06065 // are next to each other in the list. 06066 // To help reduce the number of CSE recomputations, process all 06067 // the uses of this user that we can find this way. 06068 do { 06069 unsigned i = Uses[UseIndex].Index; 06070 SDUse &Use = *Uses[UseIndex].Use; 06071 ++UseIndex; 06072 06073 Use.set(To[i]); 06074 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User); 06075 06076 // Now that we have modified User, add it back to the CSE maps. If it 06077 // already exists there, recursively merge the results together. 06078 AddModifiedNodeToCSEMaps(User); 06079 } 06080 } 06081 06082 /// AssignTopologicalOrder - Assign a unique node id for each node in the DAG 06083 /// based on their topological order. It returns the maximum id and a vector 06084 /// of the SDNodes* in assigned order by reference. 06085 unsigned SelectionDAG::AssignTopologicalOrder() { 06086 06087 unsigned DAGSize = 0; 06088 06089 // SortedPos tracks the progress of the algorithm. Nodes before it are 06090 // sorted, nodes after it are unsorted. When the algorithm completes 06091 // it is at the end of the list. 06092 allnodes_iterator SortedPos = allnodes_begin(); 06093 06094 // Visit all the nodes. Move nodes with no operands to the front of 06095 // the list immediately. Annotate nodes that do have operands with their 06096 // operand count. Before we do this, the Node Id fields of the nodes 06097 // may contain arbitrary values. After, the Node Id fields for nodes 06098 // before SortedPos will contain the topological sort index, and the 06099 // Node Id fields for nodes At SortedPos and after will contain the 06100 // count of outstanding operands. 06101 for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ) { 06102 SDNode *N = I++; 06103 checkForCycles(N, this); 06104 unsigned Degree = N->getNumOperands(); 06105 if (Degree == 0) { 06106 // A node with no uses, add it to the result array immediately. 06107 N->setNodeId(DAGSize++); 06108 allnodes_iterator Q = N; 06109 if (Q != SortedPos) 06110 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q)); 06111 assert(SortedPos != AllNodes.end() && "Overran node list"); 06112 ++SortedPos; 06113 } else { 06114 // Temporarily use the Node Id as scratch space for the degree count. 06115 N->setNodeId(Degree); 06116 } 06117 } 06118 06119 // Visit all the nodes. As we iterate, move nodes into sorted order, 06120 // such that by the time the end is reached all nodes will be sorted. 06121 for (allnodes_iterator I = allnodes_begin(),E = allnodes_end(); I != E; ++I) { 06122 SDNode *N = I; 06123 checkForCycles(N, this); 06124 // N is in sorted position, so all its uses have one less operand 06125 // that needs to be sorted. 06126 for (SDNode::use_iterator UI = N->use_begin(), UE = N->use_end(); 06127 UI != UE; ++UI) { 06128 SDNode *P = *UI; 06129 unsigned Degree = P->getNodeId(); 06130 assert(Degree != 0 && "Invalid node degree"); 06131 --Degree; 06132 if (Degree == 0) { 06133 // All of P's operands are sorted, so P may sorted now. 06134 P->setNodeId(DAGSize++); 06135 if (P != SortedPos) 06136 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P)); 06137 assert(SortedPos != AllNodes.end() && "Overran node list"); 06138 ++SortedPos; 06139 } else { 06140 // Update P's outstanding operand count. 06141 P->setNodeId(Degree); 06142 } 06143 } 06144 if (I == SortedPos) { 06145 #ifndef NDEBUG 06146 SDNode *S = ++I; 06147 dbgs() << "Overran sorted position:\n"; 06148 S->dumprFull(this); dbgs() << "\n"; 06149 dbgs() << "Checking if this is due to cycles\n"; 06150 checkForCycles(this, true); 06151 #endif 06152 llvm_unreachable(nullptr); 06153 } 06154 } 06155 06156 assert(SortedPos == AllNodes.end() && 06157 "Topological sort incomplete!"); 06158 assert(AllNodes.front().getOpcode() == ISD::EntryToken && 06159 "First node in topological sort is not the entry token!"); 06160 assert(AllNodes.front().getNodeId() == 0 && 06161 "First node in topological sort has non-zero id!"); 06162 assert(AllNodes.front().getNumOperands() == 0 && 06163 "First node in topological sort has operands!"); 06164 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 && 06165 "Last node in topologic sort has unexpected id!"); 06166 assert(AllNodes.back().use_empty() && 06167 "Last node in topologic sort has users!"); 06168 assert(DAGSize == allnodes_size() && "Node count mismatch!"); 06169 return DAGSize; 06170 } 06171 06172 /// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the 06173 /// value is produced by SD. 06174 void SelectionDAG::AddDbgValue(SDDbgValue *DB, SDNode *SD, bool isParameter) { 06175 DbgInfo->add(DB, SD, isParameter); 06176 if (SD) 06177 SD->setHasDebugValue(true); 06178 } 06179 06180 /// TransferDbgValues - Transfer SDDbgValues. 06181 void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) { 06182 if (From == To || !From.getNode()->getHasDebugValue()) 06183 return; 06184 SDNode *FromNode = From.getNode(); 06185 SDNode *ToNode = To.getNode(); 06186 ArrayRef<SDDbgValue *> DVs = GetDbgValues(FromNode); 06187 SmallVector<SDDbgValue *, 2> ClonedDVs; 06188 for (ArrayRef<SDDbgValue *>::iterator I = DVs.begin(), E = DVs.end(); 06189 I != E; ++I) { 06190 SDDbgValue *Dbg = *I; 06191 if (Dbg->getKind() == SDDbgValue::SDNODE) { 06192 SDDbgValue *Clone = getDbgValue(Dbg->getMDPtr(), ToNode, To.getResNo(), 06193 Dbg->isIndirect(), 06194 Dbg->getOffset(), Dbg->getDebugLoc(), 06195 Dbg->getOrder()); 06196 ClonedDVs.push_back(Clone); 06197 } 06198 } 06199 for (SmallVectorImpl<SDDbgValue *>::iterator I = ClonedDVs.begin(), 06200 E = ClonedDVs.end(); I != E; ++I) 06201 AddDbgValue(*I, ToNode, false); 06202 } 06203 06204 //===----------------------------------------------------------------------===// 06205 // SDNode Class 06206 //===----------------------------------------------------------------------===// 06207 06208 HandleSDNode::~HandleSDNode() { 06209 DropOperands(); 06210 } 06211 06212 GlobalAddressSDNode::GlobalAddressSDNode(unsigned Opc, unsigned Order, 06213 DebugLoc DL, const GlobalValue *GA, 06214 EVT VT, int64_t o, unsigned char TF) 06215 : SDNode(Opc, Order, DL, getSDVTList(VT)), Offset(o), TargetFlags(TF) { 06216 TheGlobal = GA; 06217 } 06218 06219 AddrSpaceCastSDNode::AddrSpaceCastSDNode(unsigned Order, DebugLoc dl, EVT VT, 06220 SDValue X, unsigned SrcAS, 06221 unsigned DestAS) 06222 : UnarySDNode(ISD::ADDRSPACECAST, Order, dl, getSDVTList(VT), X), 06223 SrcAddrSpace(SrcAS), DestAddrSpace(DestAS) {} 06224 06225 MemSDNode::MemSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 06226 EVT memvt, MachineMemOperand *mmo) 06227 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MMO(mmo) { 06228 SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(), 06229 MMO->isNonTemporal(), MMO->isInvariant()); 06230 assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!"); 06231 assert(isNonTemporal() == MMO->isNonTemporal() && 06232 "Non-temporal encoding error!"); 06233 // We check here that the size of the memory operand fits within the size of 06234 // the MMO. This is because the MMO might indicate only a possible address 06235 // range instead of specifying the affected memory addresses precisely. 06236 assert(memvt.getStoreSize() <= MMO->getSize() && "Size mismatch!"); 06237 } 06238 06239 MemSDNode::MemSDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs, 06240 ArrayRef<SDValue> Ops, EVT memvt, MachineMemOperand *mmo) 06241 : SDNode(Opc, Order, dl, VTs, Ops), 06242 MemoryVT(memvt), MMO(mmo) { 06243 SubclassData = encodeMemSDNodeFlags(0, ISD::UNINDEXED, MMO->isVolatile(), 06244 MMO->isNonTemporal(), MMO->isInvariant()); 06245 assert(isVolatile() == MMO->isVolatile() && "Volatile encoding error!"); 06246 assert(memvt.getStoreSize() <= MMO->getSize() && "Size mismatch!"); 06247 } 06248 06249 /// Profile - Gather unique data for the node. 06250 /// 06251 void SDNode::Profile(FoldingSetNodeID &ID) const { 06252 AddNodeIDNode(ID, this); 06253 } 06254 06255 namespace { 06256 struct EVTArray { 06257 std::vector<EVT> VTs; 06258 06259 EVTArray() { 06260 VTs.reserve(MVT::LAST_VALUETYPE); 06261 for (unsigned i = 0; i < MVT::LAST_VALUETYPE; ++i) 06262 VTs.push_back(MVT((MVT::SimpleValueType)i)); 06263 } 06264 }; 06265 } 06266 06267 static ManagedStatic<std::set<EVT, EVT::compareRawBits> > EVTs; 06268 static ManagedStatic<EVTArray> SimpleVTArray; 06269 static ManagedStatic<sys::SmartMutex<true> > VTMutex; 06270 06271 /// getValueTypeList - Return a pointer to the specified value type. 06272 /// 06273 const EVT *SDNode::getValueTypeList(EVT VT) { 06274 if (VT.isExtended()) { 06275 sys::SmartScopedLock<true> Lock(*VTMutex); 06276 return &(*EVTs->insert(VT).first); 06277 } else { 06278 assert(VT.getSimpleVT() < MVT::LAST_VALUETYPE && 06279 "Value type out of range!"); 06280 return &SimpleVTArray->VTs[VT.getSimpleVT().SimpleTy]; 06281 } 06282 } 06283 06284 /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the 06285 /// indicated value. This method ignores uses of other values defined by this 06286 /// operation. 06287 bool SDNode::hasNUsesOfValue(unsigned NUses, unsigned Value) const { 06288 assert(Value < getNumValues() && "Bad value!"); 06289 06290 // TODO: Only iterate over uses of a given value of the node 06291 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) { 06292 if (UI.getUse().getResNo() == Value) { 06293 if (NUses == 0) 06294 return false; 06295 --NUses; 06296 } 06297 } 06298 06299 // Found exactly the right number of uses? 06300 return NUses == 0; 06301 } 06302 06303 06304 /// hasAnyUseOfValue - Return true if there are any use of the indicated 06305 /// value. This method ignores uses of other values defined by this operation. 06306 bool SDNode::hasAnyUseOfValue(unsigned Value) const { 06307 assert(Value < getNumValues() && "Bad value!"); 06308 06309 for (SDNode::use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) 06310 if (UI.getUse().getResNo() == Value) 06311 return true; 06312 06313 return false; 06314 } 06315 06316 06317 /// isOnlyUserOf - Return true if this node is the only use of N. 06318 /// 06319 bool SDNode::isOnlyUserOf(SDNode *N) const { 06320 bool Seen = false; 06321 for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) { 06322 SDNode *User = *I; 06323 if (User == this) 06324 Seen = true; 06325 else 06326 return false; 06327 } 06328 06329 return Seen; 06330 } 06331 06332 /// isOperand - Return true if this node is an operand of N. 06333 /// 06334 bool SDValue::isOperandOf(SDNode *N) const { 06335 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) 06336 if (*this == N->getOperand(i)) 06337 return true; 06338 return false; 06339 } 06340 06341 bool SDNode::isOperandOf(SDNode *N) const { 06342 for (unsigned i = 0, e = N->NumOperands; i != e; ++i) 06343 if (this == N->OperandList[i].getNode()) 06344 return true; 06345 return false; 06346 } 06347 06348 /// reachesChainWithoutSideEffects - Return true if this operand (which must 06349 /// be a chain) reaches the specified operand without crossing any 06350 /// side-effecting instructions on any chain path. In practice, this looks 06351 /// through token factors and non-volatile loads. In order to remain efficient, 06352 /// this only looks a couple of nodes in, it does not do an exhaustive search. 06353 bool SDValue::reachesChainWithoutSideEffects(SDValue Dest, 06354 unsigned Depth) const { 06355 if (*this == Dest) return true; 06356 06357 // Don't search too deeply, we just want to be able to see through 06358 // TokenFactor's etc. 06359 if (Depth == 0) return false; 06360 06361 // If this is a token factor, all inputs to the TF happen in parallel. If any 06362 // of the operands of the TF does not reach dest, then we cannot do the xform. 06363 if (getOpcode() == ISD::TokenFactor) { 06364 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) 06365 if (!getOperand(i).reachesChainWithoutSideEffects(Dest, Depth-1)) 06366 return false; 06367 return true; 06368 } 06369 06370 // Loads don't have side effects, look through them. 06371 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) { 06372 if (!Ld->isVolatile()) 06373 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1); 06374 } 06375 return false; 06376 } 06377 06378 /// hasPredecessor - Return true if N is a predecessor of this node. 06379 /// N is either an operand of this node, or can be reached by recursively 06380 /// traversing up the operands. 06381 /// NOTE: This is an expensive method. Use it carefully. 06382 bool SDNode::hasPredecessor(const SDNode *N) const { 06383 SmallPtrSet<const SDNode *, 32> Visited; 06384 SmallVector<const SDNode *, 16> Worklist; 06385 return hasPredecessorHelper(N, Visited, Worklist); 06386 } 06387 06388 bool 06389 SDNode::hasPredecessorHelper(const SDNode *N, 06390 SmallPtrSetImpl<const SDNode *> &Visited, 06391 SmallVectorImpl<const SDNode *> &Worklist) const { 06392 if (Visited.empty()) { 06393 Worklist.push_back(this); 06394 } else { 06395 // Take a look in the visited set. If we've already encountered this node 06396 // we needn't search further. 06397 if (Visited.count(N)) 06398 return true; 06399 } 06400 06401 // Haven't visited N yet. Continue the search. 06402 while (!Worklist.empty()) { 06403 const SDNode *M = Worklist.pop_back_val(); 06404 for (unsigned i = 0, e = M->getNumOperands(); i != e; ++i) { 06405 SDNode *Op = M->getOperand(i).getNode(); 06406 if (Visited.insert(Op)) 06407 Worklist.push_back(Op); 06408 if (Op == N) 06409 return true; 06410 } 06411 } 06412 06413 return false; 06414 } 06415 06416 uint64_t SDNode::getConstantOperandVal(unsigned Num) const { 06417 assert(Num < NumOperands && "Invalid child # of SDNode!"); 06418 return cast<ConstantSDNode>(OperandList[Num])->getZExtValue(); 06419 } 06420 06421 SDValue SelectionDAG::UnrollVectorOp(SDNode *N, unsigned ResNE) { 06422 assert(N->getNumValues() == 1 && 06423 "Can't unroll a vector with multiple results!"); 06424 06425 EVT VT = N->getValueType(0); 06426 unsigned NE = VT.getVectorNumElements(); 06427 EVT EltVT = VT.getVectorElementType(); 06428 SDLoc dl(N); 06429 06430 SmallVector<SDValue, 8> Scalars; 06431 SmallVector<SDValue, 4> Operands(N->getNumOperands()); 06432 06433 // If ResNE is 0, fully unroll the vector op. 06434 if (ResNE == 0) 06435 ResNE = NE; 06436 else if (NE > ResNE) 06437 NE = ResNE; 06438 06439 unsigned i; 06440 for (i= 0; i != NE; ++i) { 06441 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) { 06442 SDValue Operand = N->getOperand(j); 06443 EVT OperandVT = Operand.getValueType(); 06444 if (OperandVT.isVector()) { 06445 // A vector operand; extract a single element. 06446 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 06447 EVT OperandEltVT = OperandVT.getVectorElementType(); 06448 Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, 06449 OperandEltVT, 06450 Operand, 06451 getConstant(i, TLI->getVectorIdxTy())); 06452 } else { 06453 // A scalar operand; just use it as is. 06454 Operands[j] = Operand; 06455 } 06456 } 06457 06458 switch (N->getOpcode()) { 06459 default: 06460 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands)); 06461 break; 06462 case ISD::VSELECT: 06463 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands)); 06464 break; 06465 case ISD::SHL: 06466 case ISD::SRA: 06467 case ISD::SRL: 06468 case ISD::ROTL: 06469 case ISD::ROTR: 06470 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0], 06471 getShiftAmountOperand(Operands[0].getValueType(), 06472 Operands[1]))); 06473 break; 06474 case ISD::SIGN_EXTEND_INREG: 06475 case ISD::FP_ROUND_INREG: { 06476 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType(); 06477 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, 06478 Operands[0], 06479 getValueType(ExtVT))); 06480 } 06481 } 06482 } 06483 06484 for (; i < ResNE; ++i) 06485 Scalars.push_back(getUNDEF(EltVT)); 06486 06487 return getNode(ISD::BUILD_VECTOR, dl, 06488 EVT::getVectorVT(*getContext(), EltVT, ResNE), Scalars); 06489 } 06490 06491 06492 /// isConsecutiveLoad - Return true if LD is loading 'Bytes' bytes from a 06493 /// location that is 'Dist' units away from the location that the 'Base' load 06494 /// is loading from. 06495 bool SelectionDAG::isConsecutiveLoad(LoadSDNode *LD, LoadSDNode *Base, 06496 unsigned Bytes, int Dist) const { 06497 if (LD->getChain() != Base->getChain()) 06498 return false; 06499 EVT VT = LD->getValueType(0); 06500 if (VT.getSizeInBits() / 8 != Bytes) 06501 return false; 06502 06503 SDValue Loc = LD->getOperand(1); 06504 SDValue BaseLoc = Base->getOperand(1); 06505 if (Loc.getOpcode() == ISD::FrameIndex) { 06506 if (BaseLoc.getOpcode() != ISD::FrameIndex) 06507 return false; 06508 const MachineFrameInfo *MFI = getMachineFunction().getFrameInfo(); 06509 int FI = cast<FrameIndexSDNode>(Loc)->getIndex(); 06510 int BFI = cast<FrameIndexSDNode>(BaseLoc)->getIndex(); 06511 int FS = MFI->getObjectSize(FI); 06512 int BFS = MFI->getObjectSize(BFI); 06513 if (FS != BFS || FS != (int)Bytes) return false; 06514 return MFI->getObjectOffset(FI) == (MFI->getObjectOffset(BFI) + Dist*Bytes); 06515 } 06516 06517 // Handle X+C 06518 if (isBaseWithConstantOffset(Loc) && Loc.getOperand(0) == BaseLoc && 06519 cast<ConstantSDNode>(Loc.getOperand(1))->getSExtValue() == Dist*Bytes) 06520 return true; 06521 06522 const GlobalValue *GV1 = nullptr; 06523 const GlobalValue *GV2 = nullptr; 06524 int64_t Offset1 = 0; 06525 int64_t Offset2 = 0; 06526 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 06527 bool isGA1 = TLI->isGAPlusOffset(Loc.getNode(), GV1, Offset1); 06528 bool isGA2 = TLI->isGAPlusOffset(BaseLoc.getNode(), GV2, Offset2); 06529 if (isGA1 && isGA2 && GV1 == GV2) 06530 return Offset1 == (Offset2 + Dist*Bytes); 06531 return false; 06532 } 06533 06534 06535 /// InferPtrAlignment - Infer alignment of a load / store address. Return 0 if 06536 /// it cannot be inferred. 06537 unsigned SelectionDAG::InferPtrAlignment(SDValue Ptr) const { 06538 // If this is a GlobalAddress + cst, return the alignment. 06539 const GlobalValue *GV; 06540 int64_t GVOffset = 0; 06541 const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); 06542 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) { 06543 unsigned PtrWidth = TLI->getPointerTypeSizeInBits(GV->getType()); 06544 APInt KnownZero(PtrWidth, 0), KnownOne(PtrWidth, 0); 06545 llvm::computeKnownBits(const_cast<GlobalValue*>(GV), KnownZero, KnownOne, 06546 TLI->getDataLayout()); 06547 unsigned AlignBits = KnownZero.countTrailingOnes(); 06548 unsigned Align = AlignBits ? 1 << std::min(31U, AlignBits) : 0; 06549 if (Align) 06550 return MinAlign(Align, GVOffset); 06551 } 06552 06553 // If this is a direct reference to a stack slot, use information about the 06554 // stack slot's alignment. 06555 int FrameIdx = 1 << 31; 06556 int64_t FrameOffset = 0; 06557 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr)) { 06558 FrameIdx = FI->getIndex(); 06559 } else if (isBaseWithConstantOffset(Ptr) && 06560 isa<FrameIndexSDNode>(Ptr.getOperand(0))) { 06561 // Handle FI+Cst 06562 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex(); 06563 FrameOffset = Ptr.getConstantOperandVal(1); 06564 } 06565 06566 if (FrameIdx != (1 << 31)) { 06567 const MachineFrameInfo &MFI = *getMachineFunction().getFrameInfo(); 06568 unsigned FIInfoAlign = MinAlign(MFI.getObjectAlignment(FrameIdx), 06569 FrameOffset); 06570 return FIInfoAlign; 06571 } 06572 06573 return 0; 06574 } 06575 06576 /// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type 06577 /// which is split (or expanded) into two not necessarily identical pieces. 06578 std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const { 06579 // Currently all types are split in half. 06580 EVT LoVT, HiVT; 06581 if (!VT.isVector()) { 06582 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT); 06583 } else { 06584 unsigned NumElements = VT.getVectorNumElements(); 06585 assert(!(NumElements & 1) && "Splitting vector, but not in half!"); 06586 LoVT = HiVT = EVT::getVectorVT(*getContext(), VT.getVectorElementType(), 06587 NumElements/2); 06588 } 06589 return std::make_pair(LoVT, HiVT); 06590 } 06591 06592 /// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the 06593 /// low/high part. 06594 std::pair<SDValue, SDValue> 06595 SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, 06596 const EVT &HiVT) { 06597 assert(LoVT.getVectorNumElements() + HiVT.getVectorNumElements() <= 06598 N.getValueType().getVectorNumElements() && 06599 "More vector elements requested than available!"); 06600 SDValue Lo, Hi; 06601 Lo = getNode(ISD::EXTRACT_SUBVECTOR, DL, LoVT, N, 06602 getConstant(0, TLI->getVectorIdxTy())); 06603 Hi = getNode(ISD::EXTRACT_SUBVECTOR, DL, HiVT, N, 06604 getConstant(LoVT.getVectorNumElements(), TLI->getVectorIdxTy())); 06605 return std::make_pair(Lo, Hi); 06606 } 06607 06608 void SelectionDAG::ExtractVectorElements(SDValue Op, 06609 SmallVectorImpl<SDValue> &Args, 06610 unsigned Start, unsigned Count) { 06611 EVT VT = Op.getValueType(); 06612 if (Count == 0) 06613 Count = VT.getVectorNumElements(); 06614 06615 EVT EltVT = VT.getVectorElementType(); 06616 EVT IdxTy = TLI->getVectorIdxTy(); 06617 SDLoc SL(Op); 06618 for (unsigned i = Start, e = Start + Count; i != e; ++i) { 06619 Args.push_back(getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, 06620 Op, getConstant(i, IdxTy))); 06621 } 06622 } 06623 06624 // getAddressSpace - Return the address space this GlobalAddress belongs to. 06625 unsigned GlobalAddressSDNode::getAddressSpace() const { 06626 return getGlobal()->getType()->getAddressSpace(); 06627 } 06628 06629 06630 Type *ConstantPoolSDNode::getType() const { 06631 if (isMachineConstantPoolEntry()) 06632 return Val.MachineCPVal->getType(); 06633 return Val.ConstVal->getType(); 06634 } 06635 06636 bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, 06637 APInt &SplatUndef, 06638 unsigned &SplatBitSize, 06639 bool &HasAnyUndefs, 06640 unsigned MinSplatBits, 06641 bool isBigEndian) const { 06642 EVT VT = getValueType(0); 06643 assert(VT.isVector() && "Expected a vector type"); 06644 unsigned sz = VT.getSizeInBits(); 06645 if (MinSplatBits > sz) 06646 return false; 06647 06648 SplatValue = APInt(sz, 0); 06649 SplatUndef = APInt(sz, 0); 06650 06651 // Get the bits. Bits with undefined values (when the corresponding element 06652 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared 06653 // in SplatValue. If any of the values are not constant, give up and return 06654 // false. 06655 unsigned int nOps = getNumOperands(); 06656 assert(nOps > 0 && "isConstantSplat has 0-size build vector"); 06657 unsigned EltBitSize = VT.getVectorElementType().getSizeInBits(); 06658 06659 for (unsigned j = 0; j < nOps; ++j) { 06660 unsigned i = isBigEndian ? nOps-1-j : j; 06661 SDValue OpVal = getOperand(i); 06662 unsigned BitPos = j * EltBitSize; 06663 06664 if (OpVal.getOpcode() == ISD::UNDEF) 06665 SplatUndef |= APInt::getBitsSet(sz, BitPos, BitPos + EltBitSize); 06666 else if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(OpVal)) 06667 SplatValue |= CN->getAPIntValue().zextOrTrunc(EltBitSize). 06668 zextOrTrunc(sz) << BitPos; 06669 else if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(OpVal)) 06670 SplatValue |= CN->getValueAPF().bitcastToAPInt().zextOrTrunc(sz) <<BitPos; 06671 else 06672 return false; 06673 } 06674 06675 // The build_vector is all constants or undefs. Find the smallest element 06676 // size that splats the vector. 06677 06678 HasAnyUndefs = (SplatUndef != 0); 06679 while (sz > 8) { 06680 06681 unsigned HalfSize = sz / 2; 06682 APInt HighValue = SplatValue.lshr(HalfSize).trunc(HalfSize); 06683 APInt LowValue = SplatValue.trunc(HalfSize); 06684 APInt HighUndef = SplatUndef.lshr(HalfSize).trunc(HalfSize); 06685 APInt LowUndef = SplatUndef.trunc(HalfSize); 06686 06687 // If the two halves do not match (ignoring undef bits), stop here. 06688 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) || 06689 MinSplatBits > HalfSize) 06690 break; 06691 06692 SplatValue = HighValue | LowValue; 06693 SplatUndef = HighUndef & LowUndef; 06694 06695 sz = HalfSize; 06696 } 06697 06698 SplatBitSize = sz; 06699 return true; 06700 } 06701 06702 SDValue BuildVectorSDNode::getSplatValue(BitVector *UndefElements) const { 06703 if (UndefElements) { 06704 UndefElements->clear(); 06705 UndefElements->resize(getNumOperands()); 06706 } 06707 SDValue Splatted; 06708 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 06709 SDValue Op = getOperand(i); 06710 if (Op.getOpcode() == ISD::UNDEF) { 06711 if (UndefElements) 06712 (*UndefElements)[i] = true; 06713 } else if (!Splatted) { 06714 Splatted = Op; 06715 } else if (Splatted != Op) { 06716 return SDValue(); 06717 } 06718 } 06719 06720 if (!Splatted) { 06721 assert(getOperand(0).getOpcode() == ISD::UNDEF && 06722 "Can only have a splat without a constant for all undefs."); 06723 return getOperand(0); 06724 } 06725 06726 return Splatted; 06727 } 06728 06729 ConstantSDNode * 06730 BuildVectorSDNode::getConstantSplatNode(BitVector *UndefElements) const { 06731 return dyn_cast_or_null<ConstantSDNode>( 06732 getSplatValue(UndefElements).getNode()); 06733 } 06734 06735 ConstantFPSDNode * 06736 BuildVectorSDNode::getConstantFPSplatNode(BitVector *UndefElements) const { 06737 return dyn_cast_or_null<ConstantFPSDNode>( 06738 getSplatValue(UndefElements).getNode()); 06739 } 06740 06741 bool BuildVectorSDNode::isConstant() const { 06742 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 06743 unsigned Opc = getOperand(i).getOpcode(); 06744 if (Opc != ISD::UNDEF && Opc != ISD::Constant && Opc != ISD::ConstantFP) 06745 return false; 06746 } 06747 return true; 06748 } 06749 06750 bool ShuffleVectorSDNode::isSplatMask(const int *Mask, EVT VT) { 06751 // Find the first non-undef value in the shuffle mask. 06752 unsigned i, e; 06753 for (i = 0, e = VT.getVectorNumElements(); i != e && Mask[i] < 0; ++i) 06754 /* search */; 06755 06756 assert(i != e && "VECTOR_SHUFFLE node with all undef indices!"); 06757 06758 // Make sure all remaining elements are either undef or the same as the first 06759 // non-undef value. 06760 for (int Idx = Mask[i]; i != e; ++i) 06761 if (Mask[i] >= 0 && Mask[i] != Idx) 06762 return false; 06763 return true; 06764 } 06765 06766 #ifndef NDEBUG 06767 static void checkForCyclesHelper(const SDNode *N, 06768 SmallPtrSetImpl<const SDNode*> &Visited, 06769 SmallPtrSetImpl<const SDNode*> &Checked, 06770 const llvm::SelectionDAG *DAG) { 06771 // If this node has already been checked, don't check it again. 06772 if (Checked.count(N)) 06773 return; 06774 06775 // If a node has already been visited on this depth-first walk, reject it as 06776 // a cycle. 06777 if (!Visited.insert(N)) { 06778 errs() << "Detected cycle in SelectionDAG\n"; 06779 dbgs() << "Offending node:\n"; 06780 N->dumprFull(DAG); dbgs() << "\n"; 06781 abort(); 06782 } 06783 06784 for(unsigned i = 0, e = N->getNumOperands(); i != e; ++i) 06785 checkForCyclesHelper(N->getOperand(i).getNode(), Visited, Checked, DAG); 06786 06787 Checked.insert(N); 06788 Visited.erase(N); 06789 } 06790 #endif 06791 06792 void llvm::checkForCycles(const llvm::SDNode *N, 06793 const llvm::SelectionDAG *DAG, 06794 bool force) { 06795 #ifndef NDEBUG 06796 bool check = force; 06797 #ifdef XDEBUG 06798 check = true; 06799 #endif // XDEBUG 06800 if (check) { 06801 assert(N && "Checking nonexistent SDNode"); 06802 SmallPtrSet<const SDNode*, 32> visited; 06803 SmallPtrSet<const SDNode*, 32> checked; 06804 checkForCyclesHelper(N, visited, checked, DAG); 06805 } 06806 #endif // !NDEBUG 06807 } 06808 06809 void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) { 06810 checkForCycles(DAG->getRoot().getNode(), DAG, force); 06811 }