41 cl::desc(
"Use ConstantInt's native fixed-length vector splat support."));
44 cl::desc(
"Use ConstantFP's native fixed-length vector splat support."));
47 cl::desc(
"Use ConstantInt's native scalable vector splat support."));
50 cl::desc(
"Use ConstantFP's native scalable vector splat support."));
59 return CFP->isZero() && CFP->isNegative();
64 return SplatCFP->isNegativeZeroValue();
67 if (
getType()->isFPOrFPVectorTy())
84 return SplatCFP->isZero();
99 return CFP->isExactlyValue(+0.0);
110 return CI->isMinusOne();
114 return CFP->getValueAPF().bitcastToAPInt().isAllOnes();
119 return SplatVal->isAllOnesValue();
131 return CFP->getValueAPF().bitcastToAPInt().isOne();
136 return SplatVal->isOneValue();
144 return !CI->isOneValue();
148 return !CFP->getValueAPF().bitcastToAPInt().isOne();
152 for (
unsigned I = 0, E = VTy->getNumElements();
I != E; ++
I) {
163 return SplatVal->isNotOneValue();
172 return CI->isMinValue(
true);
176 return CFP->getValueAPF().bitcastToAPInt().isMinSignedValue();
181 return SplatVal->isMinSignedValue();
189 return CI->isMaxValue(
true);
193 return CFP->getValueAPF().bitcastToAPInt().isMaxSignedValue();
198 return SplatVal->isMaxSignedValue();
206 return !CI->isMinValue(
true);
210 return !CFP->getValueAPF().bitcastToAPInt().isMinSignedValue();
214 for (
unsigned I = 0, E = VTy->getNumElements();
I != E; ++
I) {
225 return SplatVal->isNotMinSignedValue();
233 return CFP->getValueAPF().isFiniteNonZero();
236 for (
unsigned I = 0, E = VTy->getNumElements();
I != E; ++
I) {
238 if (!CFP || !CFP->getValueAPF().isFiniteNonZero())
246 return SplatCFP->isFiniteNonZeroFP();
254 return CFP->getValueAPF().isNormal();
257 for (
unsigned I = 0, E = VTy->getNumElements();
I != E; ++
I) {
259 if (!CFP || !CFP->getValueAPF().isNormal())
267 return SplatCFP->isNormalFP();
275 return CFP->getValueAPF().getExactInverse(
nullptr);
278 for (
unsigned I = 0, E = VTy->getNumElements();
I != E; ++
I) {
280 if (!CFP || !CFP->getValueAPF().getExactInverse(
nullptr))
288 return SplatCFP->hasExactInverseFP();
299 for (
unsigned I = 0, E = VTy->getNumElements();
I != E; ++
I) {
301 if (!CFP || !CFP->isNaN())
309 return SplatCFP->isNaN();
326 if (!(VTy->getElementType()->isIntegerTy() ||
327 VTy->getElementType()->isFloatingPointTy()))
352 if (
Constant *Elem =
C->getAggregateElement(i))
382 for (
unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
391 switch (Ty->getTypeID()) {
393 return ConstantInt::get(Ty, 0);
401 return ConstantFP::get(Ty->getContext(),
424 Constant *
C = ConstantInt::get(Ty->getContext(), V);
439 return ConstantInt::get(Ty->getContext(),
442 if (Ty->isFloatingPointTy()) {
444 return ConstantFP::get(Ty->getContext(), FL);
454 "Must be an aggregate/vector constant");
457 return Elt < CC->getNumOperands() ? CC->getOperand(Elt) :
nullptr;
460 return Elt < CAZ->getElementCount().getKnownMinValue()
461 ? CAZ->getElementValue(Elt)
465 return Elt < cast<VectorType>(
getType())
468 ? ConstantInt::get(
getContext(), CI->getValue())
472 return Elt < cast<VectorType>(
getType())
475 ? ConstantFP::get(
getContext(), CFP->getValue())
483 return Elt < PV->getNumElements() ? PV->getElementValue(Elt) :
nullptr;
486 return Elt < UV->getNumElements() ? UV->getElementValue(Elt) :
nullptr;
489 return Elt < CDS->getNumElements() ? CDS->getElementAsConstant(Elt)
499 if (CI->getValue().getActiveBits() > 64)
512#define HANDLE_CONSTANT(Name) \
513 case Value::Name##Val: \
514 cast<Name>(this)->destroyConstantImpl(); \
516#include "llvm/IR/Value.def"
530 dbgs() <<
"While deleting: " << *
this
531 <<
"\n\nUse still stuck around after Def is destroyed: " << *V
547 switch (
C->getValueID()) {
548 case Constant::ConstantIntVal:
551 case Constant::ConstantFPVal:
554 case Constant::ConstantAggregateZeroVal:
557 case Constant::ConstantArrayVal:
560 case Constant::ConstantStructVal:
563 case Constant::ConstantVectorVal:
566 case Constant::ConstantPointerNullVal:
569 case Constant::ConstantDataArrayVal:
572 case Constant::ConstantDataVectorVal:
575 case Constant::ConstantTokenNoneVal:
578 case Constant::BlockAddressVal:
581 case Constant::DSOLocalEquivalentVal:
584 case Constant::NoCFIValueVal:
587 case Constant::ConstantPtrAuthVal:
590 case Constant::UndefValueVal:
593 case Constant::PoisonValueVal:
596 case Constant::ConstantExprVal:
626 while (!WorkList.
empty()) {
635 if (Visited.
insert(ConstOp).second)
643 auto DLLImportPredicate = [](
const GlobalValue *GV) {
644 return GV->isThreadLocal();
650 auto DLLImportPredicate = [](
const GlobalValue *GV) {
651 return GV->hasDLLImportStorageClass();
669 return getRelocationInfo() == GlobalRelocation;
673 return getRelocationInfo() != NoRelocation;
676Constant::PossibleRelocationsTy Constant::getRelocationInfo()
const {
678 return GlobalRelocation;
681 return BA->getFunction()->getRelocationInfo();
684 if (CE->getOpcode() == Instruction::Sub) {
688 (LHS->getOpcode() == Instruction::PtrToInt ||
689 LHS->getOpcode() == Instruction::PtrToAddr) &&
690 (RHS->getOpcode() == Instruction::PtrToInt ||
691 RHS->getOpcode() == Instruction::PtrToAddr)) {
709 if (LHSGV->isDSOLocal() && RHSGV->isDSOLocal())
710 return LocalRelocation;
712 if (RHSGV->isDSOLocal())
713 return LocalRelocation;
720 PossibleRelocationsTy
Result = NoRelocation;
736 if (!
User)
return false;
749 if (RemoveDeadUsers) {
753 const_cast<Constant *
>(
C)->destroyConstant();
779 if (LastNonDeadUser == E)
782 I = std::next(LastNonDeadUser);
790bool Constant::hasNLiveUses(
unsigned N)
const {
791 unsigned NumUses = 0;
805 assert(
C && Replacement &&
"Expected non-nullptr constant arguments");
806 Type *Ty =
C->getType();
808 assert(Ty == Replacement->
getType() &&
"Expected matching types");
817 unsigned NumElts = VTy->getNumElements();
819 for (
unsigned i = 0; i != NumElts; ++i) {
820 Constant *EltC =
C->getAggregateElement(i);
822 "Expected matching types");
823 NewC[i] = EltC &&
match(EltC,
m_Undef()) ? Replacement : EltC;
829 assert(
C &&
Other &&
"Expected non-nullptr constant arguments");
833 Type *Ty =
C->getType();
841 Type *EltTy = VTy->getElementType();
842 unsigned NumElts = VTy->getNumElements();
847 bool FoundExtraUndef =
false;
849 for (
unsigned I = 0;
I != NumElts; ++
I) {
850 NewC[
I] =
C->getAggregateElement(
I);
852 assert(NewC[
I] && OtherEltC &&
"Unknown vector element");
855 FoundExtraUndef =
true;
881ConstantInt::ConstantInt(
Type *Ty,
const APInt &V)
885 "Invalid constant for type");
907 assert(Ty->isIntOrIntVectorTy(1) &&
"Type not i1 or vector of i1.");
915 assert(Ty->isIntOrIntVectorTy(1) &&
"Type not i1 or vector of i1.");
930 std::unique_ptr<ConstantInt> &Slot =
937 Slot.reset(
new ConstantInt(ITy, V));
947 std::unique_ptr<ConstantInt> &Slot =
948 Context.pImpl->IntSplatConstants[std::make_pair(EC, V)];
958 assert(Slot->getType() == VTy);
964 bool ImplicitTrunc) {
976 bool ImplicitTrunc) {
977 return get(Ty->getContext(),
978 APInt(Ty->getBitWidth(), V, IsSigned, ImplicitTrunc));
982 ConstantInt *
C = get(Ty->getContext(), V);
983 assert(
C->getType() == Ty->getScalarType() &&
984 "ConstantInt type doesn't match the type implied by its value!");
994 return get(Ty->getContext(),
APInt(Ty->getBitWidth(), Str, radix));
998void ConstantInt::destroyConstantImpl() {
1011 FV.
convert(Ty->getScalarType()->getFltSemantics(),
1023 ConstantFP *
C = get(Ty->getContext(), V);
1024 assert(
C->getType() == Ty->getScalarType() &&
1025 "ConstantFP type doesn't match the type implied by its value!");
1037 APFloat FV(Ty->getScalarType()->getFltSemantics(), Str);
1048 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1050 Constant *
C = get(Ty->getContext(), NaN);
1059 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1061 Constant *
C = get(Ty->getContext(), NaN);
1070 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1072 Constant *
C = get(Ty->getContext(), NaN);
1081 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1083 Constant *
C = get(Ty->getContext(), NegZero);
1096 std::unique_ptr<ConstantFP> &Slot = pImpl->
FPConstants[V];
1100 Slot.reset(
new ConstantFP(Ty, V));
1110 std::unique_ptr<ConstantFP> &Slot =
1111 Context.pImpl->FPSplatConstants[std::make_pair(EC, V)];
1121 assert(Slot->getType() == VTy);
1127 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1138 assert(&V.getSemantics() == &Ty->getScalarType()->getFltSemantics() &&
1139 "FP type Mismatch");
1143 return Val.bitwiseIsEqual(V);
1147void ConstantFP::destroyConstantImpl() {
1182 return VT->getElementCount();
1215 return AT->getNumElements();
1218 return Ty->getStructNumElements();
1251template <
typename ItTy,
typename EltTy>
1253 for (; Start != End; ++Start)
1259template <
typename SequentialTy,
typename ElementTy>
1261 assert(!V.empty() &&
"Cannot get empty int sequence.");
1269 return SequentialTy::get(V[0]->getContext(), Elts);
1272template <
typename SequentialTy,
typename ElementTy>
1274 assert(!V.empty() &&
"Cannot get empty FP sequence.");
1279 Elts.
push_back(CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
1282 return SequentialTy::getFP(V[0]->
getType(), Elts);
1285template <
typename SequenceTy>
1292 if (CI->getType()->isIntegerTy(8))
1294 else if (CI->getType()->isIntegerTy(16))
1296 else if (CI->getType()->isIntegerTy(32))
1298 else if (CI->getType()->isIntegerTy(64))
1301 if (CFP->getType()->isHalfTy() || CFP->getType()->isBFloatTy())
1303 else if (CFP->getType()->isFloatTy())
1305 else if (CFP->getType()->isDoubleTy())
1322 for (
unsigned I = 0, E = V.size();
I != E; ++
I)
1324 "Initializer for struct element doesn't match!");
1331 assert(V.size() ==
T->getNumElements() &&
1332 "Invalid initializer for constant array");
1338 return Ty->getContext().pImpl->ArrayConstants.getOrCreate(Ty, V);
1347 assert(
C->getType() == Ty->getElementType() &&
1348 "Wrong type in array element initializer");
1377 unsigned VecSize = V.size();
1379 for (
unsigned i = 0; i != VecSize; ++i)
1380 EltTypes[i] = V[i]->
getType();
1389 "ConstantStruct::getTypeForElements cannot be called on empty list");
1396 assert((
T->isOpaque() || V.size() ==
T->getNumElements()) &&
1397 "Invalid initializer for constant struct");
1402 assert((ST->isOpaque() || ST->getNumElements() == V.size()) &&
1403 "Incorrect # elements specified to ConstantStruct::get");
1408 bool isPoison =
false;
1413 isZero = V[0]->isNullValue();
1417 if (!
C->isNullValue())
1433 return ST->getContext().pImpl->StructConstants.getOrCreate(ST, V);
1440 "Invalid initializer for constant vector");
1448 return Ty->getContext().pImpl->VectorConstants.getOrCreate(Ty, V);
1452 assert(!V.empty() &&
"Vectors can't be empty");
1458 bool isZero =
C->isNullValue();
1465 for (
unsigned i = 1, e = V.size(); i != e; ++i)
1467 isZero =
isUndef = isPoison = isSplatFP = isSplatInt =
false;
1479 return ConstantFP::get(
C->getContext(),
T->getElementCount(),
1482 return ConstantInt::get(
C->getContext(),
T->getElementCount(),
1496 if (!EC.isScalable()) {
1498 if (!V->isNullValue()) {
1500 return ConstantInt::get(V->getContext(), EC,
1503 return ConstantFP::get(V->getContext(), EC,
1518 if (!V->isNullValue()) {
1520 return ConstantInt::get(V->getContext(), EC,
1523 return ConstantFP::get(V->getContext(), EC,
1529 if (V->isNullValue())
1550 pImpl->
TheNoneToken.reset(
new ConstantTokenNone(Context));
1555void ConstantTokenNone::destroyConstantImpl() {
1573 bool OnlyIfReduced,
Type *SrcTy)
const {
1580 Type *OnlyIfReducedTy = OnlyIfReduced ? Ty :
nullptr;
1582 case Instruction::Trunc:
1583 case Instruction::ZExt:
1584 case Instruction::SExt:
1585 case Instruction::FPTrunc:
1586 case Instruction::FPExt:
1587 case Instruction::UIToFP:
1588 case Instruction::SIToFP:
1589 case Instruction::FPToUI:
1590 case Instruction::FPToSI:
1591 case Instruction::PtrToAddr:
1592 case Instruction::PtrToInt:
1593 case Instruction::IntToPtr:
1594 case Instruction::BitCast:
1595 case Instruction::AddrSpaceCast:
1597 case Instruction::InsertElement:
1600 case Instruction::ExtractElement:
1602 case Instruction::ShuffleVector:
1605 case Instruction::GetElementPtr: {
1609 SrcTy ? SrcTy : GEPO->getSourceElementType(),
Ops[0],
Ops.slice(1),
1610 GEPO->getNoWrapFlags(), GEPO->getInRange(), OnlyIfReducedTy);
1624 unsigned NumBits = Ty->getIntegerBitWidth();
1625 if (Ty->isIntegerTy(1))
1626 return Val == 0 || Val == 1;
1631 unsigned NumBits = Ty->getIntegerBitWidth();
1632 if (Ty->isIntegerTy(1))
1633 return Val == 0 || Val == 1 || Val == -1;
1634 return isIntN(NumBits, Val);
1641 switch (Ty->getTypeID()) {
1699 assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) &&
1700 "Cannot create an aggregate zero of non-aggregate type!");
1702 std::unique_ptr<ConstantAggregateZero> &Entry =
1703 Ty->getContext().pImpl->CAZConstants[Ty];
1705 Entry.reset(
new ConstantAggregateZero(Ty));
1711void ConstantAggregateZero::destroyConstantImpl() {
1716void ConstantArray::destroyConstantImpl() {
1725void ConstantStruct::destroyConstantImpl() {
1730void ConstantVector::destroyConstantImpl() {
1735 assert(this->
getType()->isVectorTy() &&
"Only valid for vectors!");
1741 return ConstantInt::get(
getContext(), CI->getValue());
1743 return ConstantFP::get(
getContext(), CFP->getValue());
1745 return CV->getSplatValue();
1747 return CV->getSplatValue(AllowPoison);
1752 if (Shuf && Shuf->getOpcode() == Instruction::ShuffleVector &&
1756 if (IElt && IElt->getOpcode() == Instruction::InsertElement &&
1760 Constant *SplatVal = IElt->getOperand(1);
1763 if (Index && Index->getValue() == 0 &&
1801 return CI->getValue();
1819 return ConstantRange::getFull(
BitWidth);
1827 for (
unsigned I = 0, E = CDV->getNumElements();
I < E; ++
I)
1828 CR = CR.
unionWith(CDV->getElementAsAPInt(
I));
1834 for (
unsigned I = 0, E = CV->getNumOperands();
I < E; ++
I) {
1837 return ConstantRange::getFull(
BitWidth);
1842 return ConstantRange::getFull(
BitWidth);
1848 return ConstantRange::getFull(
BitWidth);
1855 std::unique_ptr<ConstantPointerNull> &Entry =
1858 Entry.reset(
new ConstantPointerNull(Ty));
1864void ConstantPointerNull::destroyConstantImpl() {
1873 "Target extension type not allowed to have a zeroinitializer");
1874 std::unique_ptr<ConstantTargetNone> &Entry =
1875 Ty->getContext().pImpl->CTNConstants[Ty];
1877 Entry.reset(
new ConstantTargetNone(Ty));
1883void ConstantTargetNone::destroyConstantImpl() {
1890 Entry.reset(
new UndefValue(Ty));
1896void UndefValue::destroyConstantImpl() {
1909 Entry.reset(
new PoisonValue(Ty));
1915void PoisonValue::destroyConstantImpl() {
1923 BA =
new BlockAddress(Ty, BB);
1940 BB->setHasAddressTaken(
true);
1948 assert(BA &&
"Refcount and block address map disagree!");
1953void BlockAddress::destroyConstantImpl() {
1985 Equiv =
new DSOLocalEquivalent(GV);
1988 "DSOLocalFunction does not match the expected global value");
1992DSOLocalEquivalent::DSOLocalEquivalent(
GlobalValue *GV)
1998void DSOLocalEquivalent::destroyConstantImpl() {
2003Value *DSOLocalEquivalent::handleOperandChangeImpl(
Value *From,
Value *To) {
2009 DSOLocalEquivalent *&NewEquiv =
2043 NC =
new NoCFIValue(GV);
2045 assert(
NC->getGlobalValue() == GV &&
2046 "NoCFIValue does not match the expected global value");
2056void NoCFIValue::destroyConstantImpl() {
2065 assert(GV &&
"Can only replace the operands with a global value");
2087 Constant *ArgVec[] = {Ptr,
Key, Disc, AddrDisc, DeactivationSymbol};
2115void ConstantPtrAuth::destroyConstantImpl() {
2119Value *ConstantPtrAuth::handleOperandChangeImpl(
Value *From,
Value *ToV) {
2126 unsigned NumUpdated = 0;
2129 unsigned OperandNo = 0;
2133 OperandNo = (
O - OperandList);
2141 Values,
this, From, To, NumUpdated, OperandNo);
2146 if (!CastV || CastV->getOpcode() != Instruction::IntToPtr)
2153 return IntVal->getValue() ==
Value;
2157 const Value *Discriminator,
2180 const Value *AddrDiscriminator =
nullptr;
2186 if (!
match(Discriminator,
2192 AddrDiscriminator = Discriminator;
2199 AddrDiscriminator = Cast->getPointerOperand();
2214 APInt Off2(
DL.getIndexTypeSizeInBits(AddrDiscriminator->
getType()), 0);
2218 return Base1 == Base2 && Off1 == Off2;
2227 bool OnlyIfReduced =
false) {
2228 assert(Ty->isFirstClassType() &&
"Cannot cast to an aggregate type!");
2245 bool OnlyIfReduced) {
2249 "Cast opcode not supported as constant expression");
2250 assert(
C && Ty &&
"Null arguments to getCast");
2256 case Instruction::Trunc:
2258 case Instruction::PtrToAddr:
2260 case Instruction::PtrToInt:
2262 case Instruction::IntToPtr:
2264 case Instruction::BitCast:
2266 case Instruction::AddrSpaceCast:
2272 if (
C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
2279 assert((Ty->isIntOrIntVectorTy() || Ty->isPtrOrPtrVectorTy()) &&
2282 if (Ty->isIntOrIntVectorTy())
2286 if (Ty->isPtrOrPtrVectorTy() && SrcAS != Ty->getPointerAddressSpace())
2295 assert(Ty->isPtrOrPtrVectorTy() &&
"Invalid cast");
2308 assert((fromVec == toVec) &&
"Cannot convert from scalar to/from vector");
2309 assert(
C->getType()->isIntOrIntVectorTy() &&
"Trunc operand must be integer");
2310 assert(Ty->isIntOrIntVectorTy() &&
"Trunc produces only integral");
2311 assert(
C->getType()->getScalarSizeInBits() > Ty->getScalarSizeInBits()&&
2312 "SrcTy must be larger than DestTy for Trunc!");
2318 bool OnlyIfReduced) {
2319 assert(
C->getType()->isPtrOrPtrVectorTy() &&
2320 "PtrToAddr source must be pointer or pointer vector");
2322 "PtrToAddr destination must be integer or integer vector");
2327 "Invalid cast between a different number of vector elements");
2328 return getFoldedCast(Instruction::PtrToAddr,
C, DstTy, OnlyIfReduced);
2332 bool OnlyIfReduced) {
2333 assert(
C->getType()->isPtrOrPtrVectorTy() &&
2334 "PtrToInt source must be pointer or pointer vector");
2336 "PtrToInt destination must be integer or integer vector");
2341 "Invalid cast between a different number of vector elements");
2342 return getFoldedCast(Instruction::PtrToInt,
C, DstTy, OnlyIfReduced);
2346 bool OnlyIfReduced) {
2347 assert(
C->getType()->isIntOrIntVectorTy() &&
2348 "IntToPtr source must be integer or integer vector");
2350 "IntToPtr destination must be a pointer or pointer vector");
2355 "Invalid cast between a different number of vector elements");
2356 return getFoldedCast(Instruction::IntToPtr,
C, DstTy, OnlyIfReduced);
2360 bool OnlyIfReduced) {
2362 "Invalid constantexpr bitcast!");
2366 if (
C->getType() == DstTy)
return C;
2368 return getFoldedCast(Instruction::BitCast,
C, DstTy, OnlyIfReduced);
2372 bool OnlyIfReduced) {
2374 "Invalid constantexpr addrspacecast!");
2375 return getFoldedCast(Instruction::AddrSpaceCast,
C, DstTy, OnlyIfReduced);
2379 unsigned Flags,
Type *OnlyIfReducedTy) {
2382 "Invalid opcode in binary constant expression");
2384 "Binop not supported as constant expression");
2386 "Operand types in binary constant expression should match");
2390 case Instruction::Add:
2391 case Instruction::Sub:
2392 case Instruction::Mul:
2394 "Tried to create an integer operation on a non-integer type!");
2396 case Instruction::And:
2397 case Instruction::Or:
2398 case Instruction::Xor:
2400 "Tried to create a logical operation on a non-integral type!");
2410 if (OnlyIfReducedTy == C1->
getType())
2422 case Instruction::UDiv:
2423 case Instruction::SDiv:
2424 case Instruction::URem:
2425 case Instruction::SRem:
2426 case Instruction::FAdd:
2427 case Instruction::FSub:
2428 case Instruction::FMul:
2429 case Instruction::FDiv:
2430 case Instruction::FRem:
2431 case Instruction::And:
2432 case Instruction::Or:
2433 case Instruction::LShr:
2434 case Instruction::AShr:
2435 case Instruction::Shl:
2436 case Instruction::Mul:
2438 case Instruction::Add:
2439 case Instruction::Sub:
2440 case Instruction::Xor:
2449 case Instruction::UDiv:
2450 case Instruction::SDiv:
2451 case Instruction::URem:
2452 case Instruction::SRem:
2453 case Instruction::FAdd:
2454 case Instruction::FSub:
2455 case Instruction::FMul:
2456 case Instruction::FDiv:
2457 case Instruction::FRem:
2458 case Instruction::And:
2459 case Instruction::Or:
2460 case Instruction::LShr:
2461 case Instruction::AShr:
2462 case Instruction::Shl:
2463 case Instruction::Mul:
2465 case Instruction::Add:
2466 case Instruction::Sub:
2467 case Instruction::Xor:
2476 case Instruction::ZExt:
2477 case Instruction::SExt:
2478 case Instruction::FPTrunc:
2479 case Instruction::FPExt:
2480 case Instruction::UIToFP:
2481 case Instruction::SIToFP:
2482 case Instruction::FPToUI:
2483 case Instruction::FPToSI:
2485 case Instruction::Trunc:
2486 case Instruction::PtrToAddr:
2487 case Instruction::PtrToInt:
2488 case Instruction::IntToPtr:
2489 case Instruction::BitCast:
2490 case Instruction::AddrSpaceCast:
2499 case Instruction::ZExt:
2500 case Instruction::SExt:
2501 case Instruction::FPTrunc:
2502 case Instruction::FPExt:
2503 case Instruction::UIToFP:
2504 case Instruction::SIToFP:
2505 case Instruction::FPToUI:
2506 case Instruction::FPToSI:
2508 case Instruction::Trunc:
2509 case Instruction::PtrToAddr:
2510 case Instruction::PtrToInt:
2511 case Instruction::IntToPtr:
2512 case Instruction::BitCast:
2513 case Instruction::AddrSpaceCast:
2539 Constant *Indices[2] = {Zero, One};
2547 std::optional<ConstantRange>
InRange,
2548 Type *OnlyIfReducedTy) {
2549 assert(Ty &&
"Must specify element type");
2560 if (OnlyIfReducedTy == ReqTy)
2565 EltCount = VecTy->getElementCount();
2568 std::vector<Constant*> ArgVec;
2569 ArgVec.reserve(1 + Idxs.
size());
2570 ArgVec.push_back(
C);
2572 for (; GTI != GTE; ++GTI) {
2577 "getelementptr index type missmatch");
2579 if (GTI.isStruct() && Idx->getType()->isVectorTy()) {
2580 Idx = Idx->getSplatValue();
2581 }
else if (GTI.isSequential() && EltCount.isNonZero() &&
2582 !Idx->getType()->isVectorTy()) {
2585 ArgVec.push_back(Idx);
2596 Type *OnlyIfReducedTy) {
2598 "Tried to create extractelement operation on non-vector type!");
2600 "Extractelement index must be an integer type!");
2606 if (OnlyIfReducedTy == ReqTy)
2620 "Tried to create insertelement operation on non-vector type!");
2622 "Insertelement types must match!");
2624 "Insertelement index must be i32 type!");
2629 if (OnlyIfReducedTy == Val->
getType())
2633 Constant *ArgVec[] = { Val, Elt, Idx };
2642 Type *OnlyIfReducedTy) {
2644 "Invalid shuffle vector constant expr operands!");
2649 unsigned NElts = Mask.size();
2651 Type *EltTy = V1VTy->getElementType();
2655 if (OnlyIfReducedTy == ShufTy)
2667 assert(
C->getType()->isIntOrIntVectorTy() &&
2668 "Cannot NEG a nonintegral value!");
2669 return getSub(ConstantInt::get(
C->getType(), 0),
C,
false, HasNSW);
2673 assert(
C->getType()->isIntOrIntVectorTy() &&
2674 "Cannot NOT a nonintegral value!");
2679 bool HasNUW,
bool HasNSW) {
2682 return get(Instruction::Add, C1, C2, Flags);
2686 bool HasNUW,
bool HasNSW) {
2689 return get(Instruction::Sub, C1, C2, Flags);
2693 return get(Instruction::Xor, C1, C2);
2697 Type *Ty =
C->getType();
2700 return ConstantInt::get(Ty, IVal->
logBase2());
2708 for (
unsigned I = 0, E = VecTy->getNumElements();
I != E; ++
I) {
2726 bool AllowRHSConstant,
bool NSZ) {
2732 case Instruction::Add:
2733 case Instruction::Or:
2734 case Instruction::Xor:
2736 case Instruction::Mul:
2737 return ConstantInt::get(Ty, 1);
2738 case Instruction::And:
2740 case Instruction::FAdd:
2742 case Instruction::FMul:
2743 return ConstantFP::get(Ty, 1.0);
2750 if (!AllowRHSConstant)
2754 case Instruction::Sub:
2755 case Instruction::Shl:
2756 case Instruction::LShr:
2757 case Instruction::AShr:
2758 case Instruction::FSub:
2760 case Instruction::SDiv:
2761 case Instruction::UDiv:
2762 return ConstantInt::get(Ty, 1);
2763 case Instruction::FDiv:
2764 return ConstantFP::get(Ty, 1.0);
2772 case Intrinsic::umax:
2774 case Intrinsic::umin:
2776 case Intrinsic::smax:
2779 case Intrinsic::smin:
2788 bool AllowRHSConstant,
bool NSZ) {
2789 if (
I->isBinaryOp())
2797 bool AllowLHSConstant) {
2802 case Instruction::Or:
2805 case Instruction::And:
2806 case Instruction::Mul:
2811 if (!AllowLHSConstant)
2817 case Instruction::Shl:
2818 case Instruction::LShr:
2819 case Instruction::AShr:
2820 case Instruction::SDiv:
2821 case Instruction::UDiv:
2822 case Instruction::URem:
2823 case Instruction::SRem:
2829void ConstantExpr::destroyConstantImpl() {
2837GetElementPtrConstantExpr::GetElementPtrConstantExpr(
2841 SrcElementTy(SrcElementTy),
2846 for (
unsigned i = 0, E = IdxList.
size(); i != E; ++i)
2847 OperandList[i+1] = IdxList[i];
2851 return SrcElementTy;
2855 return ResElementTy;
2867 return ATy->getElementType();
2876 if (Ty->isHalfTy() || Ty->isBFloatTy() || Ty->isFloatTy() || Ty->isDoubleTy())
2879 switch (
IT->getBitWidth()) {
2893 return AT->getNumElements();
2902const char *ConstantDataSequential::getElementPointer(
uint64_t Elt)
const {
2933 *Ty->getContext().pImpl->CDSConstants.try_emplace(Elements).first;
2939 std::unique_ptr<ConstantDataSequential> *Entry = &Slot.second;
2940 for (; *Entry; Entry = &(*Entry)->Next)
2941 if ((*Entry)->getType() == Ty)
2942 return Entry->get();
2949 return Entry->get();
2955 return Entry->get();
2958void ConstantDataSequential::destroyConstantImpl() {
2965 assert(Slot != CDSConstants.
end() &&
"CDS not found in uniquing table");
2967 std::unique_ptr<ConstantDataSequential> *Entry = &Slot->getValue();
2970 if (!(*Entry)->Next) {
2973 assert(Entry->get() ==
this &&
"Hash mismatch in ConstantDataSequential");
2981 std::unique_ptr<ConstantDataSequential> &
Node = *Entry;
2982 assert(
Node &&
"Didn't find entry in its uniquing hash table!");
2984 if (
Node.get() ==
this) {
3000 assert((ElementType->isHalfTy() || ElementType->isBFloatTy()) &&
3001 "Element type is not a 16-bit float type");
3003 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3007 assert(ElementType->isFloatTy() &&
"Element type is not a 32-bit float type");
3009 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3013 assert(ElementType->isDoubleTy() &&
3014 "Element type is not a 64-bit float type");
3016 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3028 ElementVals.
append(Str.begin(), Str.end());
3030 return get(Context, ElementVals);
3038 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3043 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3048 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3053 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3058 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3063 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3075 assert((ElementType->isHalfTy() || ElementType->isBFloatTy()) &&
3076 "Element type is not a 16-bit float type");
3078 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3083 assert(ElementType->isFloatTy() &&
"Element type is not a 32-bit float type");
3085 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3090 assert(ElementType->isDoubleTy() &&
3091 "Element type is not a 64-bit float type");
3093 const char *
Data =
reinterpret_cast<const char *
>(Elts.
data());
3099 "Element type not compatible with ConstantData");
3101 if (CI->getType()->isIntegerTy(8)) {
3103 return get(V->getContext(), Elts);
3105 if (CI->getType()->isIntegerTy(16)) {
3107 return get(V->getContext(), Elts);
3109 if (CI->getType()->isIntegerTy(32)) {
3111 return get(V->getContext(), Elts);
3113 assert(CI->getType()->isIntegerTy(64) &&
"Unsupported ConstantData type");
3115 return get(V->getContext(), Elts);
3119 if (CFP->getType()->isHalfTy()) {
3121 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3122 return getFP(V->getType(), Elts);
3124 if (CFP->getType()->isBFloatTy()) {
3126 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3127 return getFP(V->getType(), Elts);
3129 if (CFP->getType()->isFloatTy()) {
3131 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3132 return getFP(V->getType(), Elts);
3134 if (CFP->getType()->isDoubleTy()) {
3136 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3137 return getFP(V->getType(), Elts);
3145 "Accessor can only be used when element is an integer");
3146 const char *EltPtr = getElementPointer(Elt);
3153 return *
reinterpret_cast<const uint8_t *
>(EltPtr);
3155 return *
reinterpret_cast<const uint16_t *
>(EltPtr);
3157 return *
reinterpret_cast<const uint32_t *
>(EltPtr);
3159 return *
reinterpret_cast<const uint64_t *
>(EltPtr);
3165 "Accessor can only be used when element is an integer");
3166 const char *EltPtr = getElementPointer(Elt);
3173 auto EltVal = *
reinterpret_cast<const uint8_t *
>(EltPtr);
3174 return APInt(8, EltVal);
3177 auto EltVal = *
reinterpret_cast<const uint16_t *
>(EltPtr);
3178 return APInt(16, EltVal);
3181 auto EltVal = *
reinterpret_cast<const uint32_t *
>(EltPtr);
3182 return APInt(32, EltVal);
3185 auto EltVal = *
reinterpret_cast<const uint64_t *
>(EltPtr);
3186 return APInt(64, EltVal);
3192 const char *EltPtr = getElementPointer(Elt);
3196 llvm_unreachable(
"Accessor can only be used when element is float/double!");
3198 auto EltVal = *
reinterpret_cast<const uint16_t *
>(EltPtr);
3202 auto EltVal = *
reinterpret_cast<const uint16_t *
>(EltPtr);
3206 auto EltVal = *
reinterpret_cast<const uint32_t *
>(EltPtr);
3210 auto EltVal = *
reinterpret_cast<const uint64_t *
>(EltPtr);
3218 "Accessor can only be used when element is a 'float'");
3219 return *
reinterpret_cast<const float *
>(getElementPointer(Elt));
3224 "Accessor can only be used when element is a 'float'");
3225 return *
reinterpret_cast<const double *
>(getElementPointer(Elt));
3247 if (Str.back() != 0)
return false;
3250 return !Str.drop_back().contains(0);
3253bool ConstantDataVector::isSplatData()
const {
3268 IsSplat = isSplatData();
3293 Value *Replacement =
nullptr;
3297#define HANDLE_CONSTANT(Name) \
3298 case Value::Name##Val: \
3299 Replacement = cast<Name>(this)->handleOperandChangeImpl(From, To); \
3301#include "llvm/IR/Value.def"
3310 assert(Replacement !=
this &&
"I didn't contain From!");
3319Value *ConstantArray::handleOperandChangeImpl(
Value *From,
Value *To) {
3328 unsigned NumUpdated = 0;
3331 bool AllSame =
true;
3333 unsigned OperandNo = 0;
3337 OperandNo = (O - OperandList);
3342 AllSame &= Val == ToC;
3357 Values,
this, From, ToC, NumUpdated, OperandNo);
3360Value *ConstantStruct::handleOperandChangeImpl(
Value *From,
Value *To) {
3371 unsigned NumUpdated = 0;
3372 bool AllSame =
true;
3373 unsigned OperandNo = 0;
3377 OperandNo = (
O - OperandList);
3382 AllSame &= Val == ToC;
3393 Values,
this, From, ToC, NumUpdated, OperandNo);
3396Value *ConstantVector::handleOperandChangeImpl(
Value *From,
Value *To) {
3402 unsigned NumUpdated = 0;
3403 unsigned OperandNo = 0;
3419 Values,
this, From, ToC, NumUpdated, OperandNo);
3422Value *ConstantExpr::handleOperandChangeImpl(
Value *From,
Value *ToV) {
3427 unsigned NumUpdated = 0;
3428 unsigned OperandNo = 0;
3438 assert(NumUpdated &&
"I didn't contain From!");
3445 NewOps,
this, From, To, NumUpdated, OperandNo);
3453 case Instruction::Trunc:
3454 case Instruction::PtrToAddr:
3455 case Instruction::PtrToInt:
3456 case Instruction::IntToPtr:
3457 case Instruction::BitCast:
3458 case Instruction::AddrSpaceCast:
3461 case Instruction::InsertElement:
3463 case Instruction::ExtractElement:
3465 case Instruction::ShuffleVector:
3468 case Instruction::GetElementPtr: {
3471 Ops.slice(1), GO->getNoWrapFlags(),
"");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static bool isAllZeros(StringRef Arr)
Return true if the array is empty or all zeros.
static cl::opt< bool > UseConstantIntForScalableSplat("use-constant-int-for-scalable-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantInt's native scalable vector splat support."))
static cl::opt< bool > UseConstantIntForFixedLengthSplat("use-constant-int-for-fixed-length-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantInt's native fixed-length vector splat support."))
static Constant * getFPSequenceIfElementsMatch(ArrayRef< Constant * > V)
static bool rangeOnlyContains(ItTy Start, ItTy End, EltTy Elt)
static Constant * getIntSequenceIfElementsMatch(ArrayRef< Constant * > V)
static Constant * getSequenceIfElementsMatch(Constant *C, ArrayRef< Constant * > V)
static bool ConstHasGlobalValuePredicate(const Constant *C, bool(*Predicate)(const GlobalValue *))
Check if C contains a GlobalValue for which Predicate is true.
static cl::opt< bool > UseConstantFPForScalableSplat("use-constant-fp-for-scalable-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantFP's native scalable vector splat support."))
static bool constantIsDead(const Constant *C, bool RemoveDeadUsers)
Return true if the specified constantexpr is dead.
static bool containsUndefinedElement(const Constant *C, function_ref< bool(const Constant *)> HasFn)
static Constant * getFoldedCast(Instruction::CastOps opc, Constant *C, Type *Ty, bool OnlyIfReduced=false)
This is a utility function to handle folding of casts and lookup of the cast in the ExprConstants map...
static cl::opt< bool > UseConstantFPForFixedLengthSplat("use-constant-fp-for-fixed-length-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantFP's native fixed-length vector splat support."))
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static char getTypeID(Type *Ty)
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
static bool isUndef(const MachineInstr &MI)
Merge contiguous icmps into a memcmp
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
uint64_t IntrinsicInst * II
static unsigned getNumElements(Type *Ty)
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
static Function * getFunction(FunctionType *Ty, const Twine &Name, Module *M)
static const fltSemantics & IEEEsingle()
static const fltSemantics & BFloat()
static const fltSemantics & IEEEquad()
static const fltSemantics & IEEEdouble()
static const fltSemantics & x87DoubleExtended()
static constexpr roundingMode rmNearestTiesToEven
static const fltSemantics & IEEEhalf()
static const fltSemantics & PPCDoubleDouble()
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
static APFloat getSNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for SNaN values.
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
static LLVM_ABI APFloat getAllOnesValue(const fltSemantics &Semantics)
Returns a float which is bitcasted from an all one value int.
const fltSemantics & getSemantics() const
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
unsigned logBase2() const
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Class to represent array types.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
const Function * getParent() const
Return the enclosing method, or null if none.
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
BinaryConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to impleme...
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
The address of a basic block.
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
BasicBlock * getBasicBlock() const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
CastConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to implement...
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
All zero aggregate value.
LLVM_ABI ElementCount getElementCount() const
Return the number of elements in the array, vector, or struct.
LLVM_ABI Constant * getSequentialElement() const
If this CAZ has array or vector type, return a zero with the right element type.
LLVM_ABI Constant * getElementValue(Constant *C) const
Return a zero of the right value for the specified GEP index if we can, otherwise return null (e....
LLVM_ABI Constant * getStructElement(unsigned Elt) const
If this CAZ has struct type, return a zero with the right element type for the specified element.
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
Base class for aggregate constants (with operands).
LLVM_ABI ConstantAggregate(Type *T, ValueTy VT, ArrayRef< Constant * > V, AllocInfo AllocInfo)
ConstantArray - Constant Array Declarations.
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
An array constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of array type with a float element type taken from argument ...
LLVM_ABI APFloat getElementAsAPFloat(uint64_t i) const
If this is a sequential container of floating point type, return the specified element as an APFloat.
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
LLVM_ABI Constant * getElementAsConstant(uint64_t i) const
Return a Constant for a specified index's element.
LLVM_ABI uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
LLVM_ABI float getElementAsFloat(uint64_t i) const
If this is an sequential container of floats, return the specified element as a float.
LLVM_ABI bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers.
LLVM_ABI uint64_t getNumElements() const
Return the number of elements in the array or vector.
LLVM_ABI APInt getElementAsAPInt(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element as an APInt...
static LLVM_ABI Constant * getImpl(StringRef Bytes, Type *Ty)
This is the underlying implementation of all of the ConstantDataSequential::get methods.
LLVM_ABI double getElementAsDouble(uint64_t i) const
If this is an sequential container of doubles, return the specified element as a double.
LLVM_ABI Type * getElementType() const
Return the element type of the array/vector.
LLVM_ABI bool isCString() const
This method returns true if the array "isString", ends with a null byte, and does not contains any ot...
LLVM_ABI StringRef getRawDataValues() const
Return the raw, underlying, bytes of this data.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
A vector constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
LLVM_ABI Constant * getSplatValue() const
If this is a splat constant, meaning that all of the elements have the same value,...
static LLVM_ABI Constant * getSplat(unsigned NumElts, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
LLVM_ABI bool isSplat() const
Returns true if this is a splat constant, meaning that all elements have the same value.
static LLVM_ABI Constant * get(LLVMContext &Context, ArrayRef< uint8_t > Elts)
get() constructors - Return a constant with vector type with an element count and element type matchi...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of vector type with a float element type taken from argument...
Base class for constants with no operands.
A constant value that is initialized with an expression using other constant values.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
static LLVM_ABI Constant * getAlignOf(Type *Ty)
getAlignOf constant expr - computes the alignment of a type in a target independent way (Note: the re...
friend struct ConstantExprKeyType
static LLVM_ABI Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
static LLVM_ABI Constant * getTruncOrBitCast(Constant *C, Type *Ty)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
LLVM_ABI bool isCast() const
Return true if this is a convert constant expression.
static LLVM_ABI Constant * getIdentity(Instruction *I, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary or intrinsic Instruction.
static LLVM_ABI bool isDesirableCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is desirable.
LLVM_ABI Constant * getShuffleMaskForBitcode() const
Assert that this is a shufflevector and return the mask.
static LLVM_ABI Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
LLVM_ABI const char * getOpcodeName() const
Return a string representation for an opcode.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getPtrToAddr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getSizeOf(Type *Ty)
getSizeOf constant expr - computes the (alloc) size of a type (in address-units, not bits) in a targe...
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * getIntrinsicIdentity(Intrinsic::ID, Type *Ty)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static LLVM_ABI bool isDesirableBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is desirable.
LLVM_ABI ArrayRef< int > getShuffleMask() const
Assert that this is a shufflevector and return the mask.
static LLVM_ABI bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
unsigned getOpcode() const
Return the opcode at the root of this constant expression.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
static LLVM_ABI bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getExactLogBase2(Constant *C)
If C is a scalar/fixed width vector of known powers of 2, then this function returns a new scalar/fix...
Constant * getWithOperands(ArrayRef< Constant * > Ops) const
This returns the current constant expression with the operands replaced with the specified values.
LLVM_ABI Instruction * getAsInstruction() const
Returns an Instruction which implements the same operation as this ConstantExpr.
ConstantFP - Floating Point Values [float, double].
static LLVM_ABI Constant * getSNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
static LLVM_ABI Constant * getInfinity(Type *Ty, bool Negative=false)
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
static LLVM_ABI Constant * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
LLVM_ABI bool isExactlyValue(const APFloat &V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
static LLVM_ABI bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
static LLVM_ABI Constant * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
This is the shared class of boolean and integer constants.
static LLVM_ABI bool isValueValidForType(Type *Ty, uint64_t V)
This static method returns true if the type Ty is big enough to represent the value V.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
A constant pointer value that points to null.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
PointerType * getType() const
Specialize the getType() method to always return an PointerType, which reduces the amount of casting ...
A signed pointer, in the ptrauth sense.
Constant * getAddrDiscriminator() const
The address discriminator if any, or the null constant.
friend struct ConstantPtrAuthKeyType
LLVM_ABI bool isKnownCompatibleWith(const Value *Key, const Value *Discriminator, const DataLayout &DL) const
Check whether an authentication operation with key Key and (possibly blended) discriminator Discrimin...
LLVM_ABI bool hasSpecialAddressDiscriminator(uint64_t Value) const
Whether the address uses a special address discriminator.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
LLVM_ABI ConstantPtrAuth * getWithSameSchema(Constant *Pointer) const
Produce a new ptrauth expression signing the given value using the same schema as is stored in one.
ConstantInt * getKey() const
The Key ID, an i32 constant.
Constant * getDeactivationSymbol() const
bool hasAddressDiscriminator() const
Whether there is any non-null address discriminator.
ConstantInt * getDiscriminator() const
The integer discriminator, an i64 constant, or 0.
This class represents a range of values.
LLVM_ABI ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI StructType * getTypeForElements(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct type to use for a constant with the specified set of elements.
StructType * getType() const
Specialization - reduce amount of casting.
static LLVM_ABI ConstantTargetNone * get(TargetExtType *T)
Static factory methods - Return objects of the specified value.
TargetExtType * getType() const
Specialize the getType() method to always return an TargetExtType, which reduces the amount of castin...
A constant token which is empty.
static LLVM_ABI ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
void remove(ConstantClass *CP)
Remove this constant from the map.
ConstantClass * replaceOperandsInPlace(ArrayRef< Constant * > Operands, ConstantClass *CP, Value *From, Constant *To, unsigned NumUpdated=0, unsigned OperandNo=~0u)
Constant Vector Declarations.
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
LLVM_ABI bool hasExactInverseFP() const
Return true if this scalar has an exact multiplicative inverse or this vector has an exact multiplica...
static LLVM_ABI Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI bool containsUndefElement() const
Return true if this is a vector constant that includes any strictly undef (not poison) elements.
static LLVM_ABI Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
LLVM_ABI ConstantRange toConstantRange() const
Convert constant to an approximate constant range.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
LLVM_ABI bool hasZeroLiveUses() const
Return true if the constant has no live uses.
LLVM_ABI bool isOneValue() const
Returns true if the value is one.
LLVM_ABI bool isManifestConstant() const
Return true if a constant is ConstantData or a ConstantAggregate or ConstantExpr that contain only Co...
LLVM_ABI bool isNegativeZeroValue() const
Return true if the value is what would be returned by getZeroValueForNegation.
LLVM_ABI bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Constant(Type *ty, ValueTy vty, AllocInfo AllocInfo)
LLVM_ABI bool isMaxSignedValue() const
Return true if the value is the largest signed value.
LLVM_ABI bool hasOneLiveUse() const
Return true if the constant has exactly one live use.
LLVM_ABI bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry (eith...
LLVM_ABI bool isDLLImportDependent() const
Return true if the value is dependent on a dllimport variable.
LLVM_ABI const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
LLVM_ABI bool containsConstantExpression() const
Return true if this is a fixed width vector constant that includes any constant expressions.
LLVM_ABI bool isFiniteNonZeroFP() const
Return true if this is a finite and non-zero floating-point scalar constant or a fixed width vector c...
LLVM_ABI void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
LLVM_ABI bool isNormalFP() const
Return true if this is a normal (as opposed to denormal, infinity, nan, or zero) floating-point scala...
LLVM_ABI bool needsDynamicRelocation() const
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isNaN() const
Return true if this is a floating-point NaN constant or a vector floating-point constant with all NaN...
LLVM_ABI bool isMinSignedValue() const
Return true if the value is the smallest signed value.
LLVM_ABI bool isConstantUsed() const
Return true if the constant has users other than constant expressions and other dangling things.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
LLVM_ABI bool isThreadDependent() const
Return true if the value can vary between threads.
LLVM_ABI bool isZeroValue() const
Return true if the value is negative zero or null value.
LLVM_ABI void destroyConstant()
Called if some element of this constant is no longer valid.
LLVM_ABI bool isNotMinSignedValue() const
Return true if the value is not the smallest signed value, or, for vectors, does not contain smallest...
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
LLVM_ABI bool isNotOneValue() const
Return true if the value is not the one value, or, for vectors, does not contain one value elements.
LLVM_ABI bool isElementWiseEqual(Value *Y) const
Return true if this constant and a constant 'Y' are element-wise equal.
LLVM_ABI bool containsUndefOrPoisonElement() const
Return true if this is a vector constant that includes any undef or poison elements.
LLVM_ABI bool containsPoisonElement() const
Return true if this is a vector constant that includes any poison elements.
LLVM_ABI void handleOperandChange(Value *, Value *)
This method is a special form of User::replaceUsesOfWith (which does not work on constants) that does...
Wrapper for a function that represents a value that functionally represents the original function.
GlobalValue * getGlobalValue() const
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
A parsed version of the target data layout string in and methods for querying it.
static constexpr ElementCount getFixed(ScalarTy MinVal)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Represents flags for the getelementptr instruction/expression.
GetElementPtrConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
std::optional< ConstantRange > getInRange() const
Type * getResultElementType() const
Type * getSourceElementType() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static Type * getGEPReturnType(Value *Ptr, ArrayRef< Value * > IdxList)
Returns the pointer type returned by the GEP instruction, which may be a vector of pointers.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
PointerType * getType() const
Global values are always pointers.
InsertElementConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
const char * getOpcodeName() const
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
A wrapper class for inspecting calls to intrinsic functions.
DenseMap< unsigned, std::unique_ptr< ConstantInt > > IntOneConstants
DenseMap< unsigned, std::unique_ptr< ConstantInt > > IntZeroConstants
DenseMap< APFloat, std::unique_ptr< ConstantFP > > FPConstants
DenseMap< PointerType *, std::unique_ptr< ConstantPointerNull > > CPNConstants
DenseMap< Type *, std::unique_ptr< ConstantAggregateZero > > CAZConstants
ConstantInt * TheFalseVal
DenseMap< Type *, std::unique_ptr< PoisonValue > > PVConstants
DenseMap< APInt, std::unique_ptr< ConstantInt > > IntConstants
std::unique_ptr< ConstantTokenNone > TheNoneToken
VectorConstantsTy VectorConstants
DenseMap< const GlobalValue *, NoCFIValue * > NoCFIValues
DenseMap< const BasicBlock *, BlockAddress * > BlockAddresses
DenseMap< Type *, std::unique_ptr< UndefValue > > UVConstants
StringMap< std::unique_ptr< ConstantDataSequential > > CDSConstants
StructConstantsTy StructConstants
ConstantUniqueMap< ConstantPtrAuth > ConstantPtrAuths
DenseMap< TargetExtType *, std::unique_ptr< ConstantTargetNone > > CTNConstants
ConstantUniqueMap< ConstantExpr > ExprConstants
ArrayConstantsTy ArrayConstants
DenseMap< const GlobalValue *, DSOLocalEquivalent * > DSOLocalEquivalents
This is an important class for using LLVM in a threaded context.
LLVMContextImpl *const pImpl
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
PointerType * getType() const
NoCFIValue is always a pointer.
GlobalValue * getGlobalValue() const
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
In order to facilitate speculative execution, many instructions do not invoke immediate undefined beh...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
LLVM_ABI PoisonValue * getStructElement(unsigned Elt) const
If this poison has struct type, return a poison with the right element type for the specified element...
LLVM_ABI PoisonValue * getSequentialElement() const
If this poison has array or vector type, return a poison with the right element type.
LLVM_ABI PoisonValue * getElementValue(Constant *C) const
Return an poison of the right value for the specified GEP index if we can, otherwise return null (e....
ShuffleVectorConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
This instruction constructs a fixed permutation of two input vectors.
static LLVM_ABI bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
iterator find(StringRef Key)
StringRef - Represent a constant reference to a string, i.e.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
@ HasZeroInit
zeroinitializer is valid for this target extension type.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
bool isVectorTy() const
True if this is an instance of VectorType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
@ HalfTyID
16-bit floating point type
@ TargetExtTyID
Target extension type.
@ ScalableVectorTyID
Scalable SIMD vector type.
@ FloatTyID
32-bit floating point type
@ IntegerTyID
Arbitrary bit width integers.
@ FixedVectorTyID
Fixed width SIMD vector type.
@ BFloatTyID
16-bit floating point type (7-bit significand)
@ DoubleTyID
64-bit floating point type
@ X86_FP80TyID
80-bit floating point type (X87)
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
@ FP128TyID
128-bit floating point type (112-bit significand)
static LLVM_ABI Type * getFloatingPointTy(LLVMContext &C, const fltSemantics &S)
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isIntegerTy() const
True if this is an instance of IntegerType.
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
'undef' values are things that do not have specified contents.
LLVM_ABI UndefValue * getElementValue(Constant *C) const
Return an undef of the right value for the specified GEP index if we can, otherwise return null (e....
LLVM_ABI UndefValue * getStructElement(unsigned Elt) const
If this undef has struct type, return a undef with the right element type for the specified element.
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
LLVM_ABI unsigned getNumElements() const
Return the number of elements in the array, vector, or struct.
LLVM_ABI UndefValue * getSequentialElement() const
If this Undef has array or vector type, return a undef with the right element type.
A Use represents the edge between a Value definition and its users.
const Use * getOperandList() const
User(Type *ty, unsigned vty, AllocInfo AllocInfo)
void setOperand(unsigned i, Value *Val)
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
iterator_range< value_op_iterator > operand_values()
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
user_iterator_impl< const User > const_user_iterator
user_iterator user_begin()
LLVM_ABI Value(Type *Ty, unsigned scid)
unsigned char SubclassOptionalData
Hold subclass data that can be dropped.
LLVM_ABI const Value * stripPointerCastsAndAliases() const
Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
LLVM_ABI const Value * stripInBoundsConstantOffsets() const
Strip off pointer casts and all-constant inbounds GEPs.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< user_iterator > users()
unsigned getValueID() const
Return an ID for the concrete type of this object.
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< use_iterator > uses()
void mutateType(Type *Ty)
Mutate the type of this Value to be of the specified type.
ValueTy
Concrete subclass of this.
Base class of all SIMD vector types.
static VectorType * getInteger(VectorType *VTy)
This static method gets a VectorType with the same number of elements as the input type,...
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr ScalarTy getFixedValue() const
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_Undef()
Match an arbitrary undef constant.
initializer< Ty > init(const Ty &Val)
NodeAddr< UseNode * > Use
NodeAddr< NodeBase * > Node
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Constant * ConstantFoldCompareInstruction(CmpInst::Predicate Predicate, Constant *C1, Constant *C2)
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
gep_type_iterator gep_type_end(const User *GEP)
void deleteConstant(Constant *C)
LLVM_ABI Constant * ConstantFoldGetElementPtr(Type *Ty, Constant *C, std::optional< ConstantRange > InRange, ArrayRef< Value * > Idxs)
auto dyn_cast_or_null(const Y &Val)
LLVM_ABI Constant * ConstantFoldInsertElementInstruction(Constant *Val, Constant *Elt, Constant *Idx)
Attempt to constant fold an insertelement instruction with the specified operands and indices.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Constant * ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx)
Attempt to constant fold an extractelement instruction with the specified operands and indices.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
LLVM_ABI Constant * ConstantFoldCastInstruction(unsigned opcode, Constant *V, Type *DestTy)
LLVM_ABI Constant * ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2, ArrayRef< int > Mask)
Attempt to constant fold a shufflevector instruction with the specified operands and mask.
LLVM_ABI Constant * ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, Constant *V2)
Implement std::hash so that hash_code can be used in STL containers.
Summary of memprof metadata on allocations.
Information about how a User object was allocated, to be passed into the User constructor.