97#ifndef LLVM_TRANSFORMS_IPO_ATTRIBUTOR_H
98#define LLVM_TRANSFORMS_IPO_ATTRIBUTOR_H
143template <
typename Fn>
class function_ref;
144struct AADepGraphNode;
147struct AbstractAttribute;
148struct InformationCache;
150struct AttributorCallGraph;
181 using Base = std::pair<Value *, const Instruction *>;
201 const Value &V,
bool ForAnalysisOnly =
true);
225std::optional<Value *>
227 const std::optional<Value *> &
B,
Type *Ty);
253 "Inconsistent state!");
270 if (R.isUnassigned())
295 return L.Offset < R.Offset;
304 static constexpr int64_t
Unassigned = std::numeric_limits<int32_t>::min();
305 static constexpr int64_t
Unknown = std::numeric_limits<int32_t>::max();
309 OS <<
"[" << R.Offset <<
", " << R.Size <<
"]";
314 return A.Offset ==
B.Offset &&
A.Size ==
B.Size;
323 RangeTy *RangePtr =
nullptr);
340 bool OnlyExact =
false);
354 bool OnlyExact =
false);
378 std::function<
bool(
const Function &
F)> GoBackwardsCB =
nullptr);
385 std::function<
bool(
const Function &
F)> GoBackwardsCB =
nullptr);
404 return Base::getEmptyKey();
407 return Base::getTombstoneKey();
410 return Base::getHashValue(VAC);
415 return Base::isEqual(
LHS,
RHS);
429 return Base::getHashValue(S);
433 return Base::isEqual(
LHS,
RHS);
446 super::getTombstoneKey());
451 for (
const auto *II : *BES)
459 if (
LHS == getEmptyKey() ||
RHS == getEmptyKey() ||
460 LHS == getTombstoneKey() ||
RHS == getTombstoneKey())
462 auto SizeLHS =
LHS ?
LHS->size() : 0;
463 auto SizeRHS =
RHS ?
RHS->size() : 0;
464 if (SizeLHS != SizeRHS)
508 return cast<AbstractAttribute>(DT.
getPointer());
597 if (
auto *
Arg = dyn_cast<Argument>(&V))
599 if (
auto *CB = dyn_cast<CallBase>(&V))
678 return Enc ==
RHS.Enc &&
RHS.CBContext == CBContext;
689 switch (getEncodingBits()) {
691 case ENC_RETURNED_VALUE:
692 case ENC_FLOATING_FUNCTION:
693 return *getAsValuePtr();
694 case ENC_CALL_SITE_ARGUMENT_USE:
695 return *(getAsUsePtr()->getUser());
708 return Arg->getParent();
709 return CB->getCalledFunction();
733 if (isa<Function>(V))
734 return &cast<Function>(V);
735 if (isa<Argument>(V))
736 return cast<Argument>(V).getParent();
737 if (isa<Instruction>(V))
738 return cast<Instruction>(V).getFunction();
745 if (
auto *
I = dyn_cast<Instruction>(&V))
747 if (
auto *
Arg = dyn_cast<Argument>(&V))
748 if (!
Arg->getParent()->isDeclaration())
749 return &
Arg->getParent()->getEntryBlock().front();
750 if (
auto *
F = dyn_cast<Function>(&V))
751 if (!
F->isDeclaration())
752 return &(
F->getEntryBlock().front());
778 return getArgNo(
true);
787 return getArgNo(
false);
807 "There is no attribute index for a floating or invalid position!");
812 char EncodingBits = getEncodingBits();
813 if (EncodingBits == ENC_CALL_SITE_ARGUMENT_USE)
815 if (EncodingBits == ENC_FLOATING_FUNCTION)
818 Value *V = getAsValuePtr();
821 if (isa<Argument>(V))
823 if (isa<Function>(V))
825 if (isa<CallBase>(V))
840 bool IgnoreSubsumingPositions =
false,
853 bool IgnoreSubsumingPositions =
false,
873 CB->setAttributes(AttrList);
903 Result.CBContext =
nullptr;
926 : CBContext(CBContext) {
933 : CBContext(CBContext) {
940 if (isa<Function>(AnchorVal) || isa<CallBase>(AnchorVal))
941 Enc = {&AnchorVal, ENC_FLOATING_FUNCTION};
943 Enc = {&AnchorVal, ENC_VALUE};
947 Enc = {&AnchorVal, ENC_VALUE};
951 Enc = {&AnchorVal, ENC_RETURNED_VALUE};
954 Enc = {&AnchorVal, ENC_VALUE};
958 "Cannot create call site argument IRP with an anchor value!");
967 int getArgNo(
bool CallbackCalleeArgIfApplicable)
const {
968 if (CallbackCalleeArgIfApplicable)
970 return Arg->getArgNo();
973 return cast<Argument>(getAsValuePtr())->getArgNo();
975 Use &
U = *getAsUsePtr();
976 return cast<CallBase>(
U.getUser())->getArgOperandNo(&U);
988 "Use constructor is for call site arguments only!");
989 Enc = {&
U, ENC_CALL_SITE_ARGUMENT_USE};
998 SmallVectorImpl<Attribute> &Attrs)
const;
1003 SmallVectorImpl<Attribute> &Attrs,
1004 Attributor &
A)
const;
1008 Value *getAsValuePtr()
const {
1009 assert(getEncodingBits() != ENC_CALL_SITE_ARGUMENT_USE &&
1010 "Not a value pointer!");
1016 Use *getAsUsePtr()
const {
1017 assert(getEncodingBits() == ENC_CALL_SITE_ARGUMENT_USE &&
1018 "Not a value pointer!");
1019 return reinterpret_cast<Use *
>(Enc.
getPointer());
1024 static bool isReturnPosition(
char EncodingBits) {
1025 return EncodingBits == ENC_RETURNED_VALUE;
1030 bool isReturnPosition()
const {
return isReturnPosition(getEncodingBits()); }
1040 ENC_RETURNED_VALUE = 0b01,
1041 ENC_FLOATING_FUNCTION = 0b10,
1042 ENC_CALL_SITE_ARGUMENT_USE = 0b11,
1047 static constexpr int NumEncodingBits =
1048 PointerLikeTypeTraits<void *>::NumLowBitsAvailable;
1049 static_assert(NumEncodingBits >= 2,
"At least two bits are required!");
1052 PointerIntPair<void *, NumEncodingBits, char> Enc;
1059 char getEncodingBits()
const {
return Enc.getInt(); }
1104 using iterator =
decltype(IRPositions)::iterator;
1127 template <
typename Analysis>
1131 if constexpr (HasLegacyWrapper<Analysis>)
1146 Pass *LegacyPass =
nullptr;
1149template <
typename Analysis>
1151 Analysis, std::void_t<typename Analysis::LegacyWrapper>> =
true;
1179 [&](
const Function &
F) {
1182 AG(AG), TargetTriple(
M.getTargetTriple()) {
1190 for (
auto &It : FuncInfoMap)
1191 It.getSecond()->~FunctionInfo();
1194 for (
auto *BES : BESets)
1195 BES->~InstExclusionSetTy();
1201 template <
typename CBTy>
1203 bool LookThroughConstantExprUses =
true) {
1210 if (LookThroughConstantExprUses && isa<ConstantExpr>(U.getUser())) {
1211 for (
Use &CEU : cast<ConstantExpr>(U.getUser())->
uses())
1231 while (!Worklist.
empty()) {
1236 if (
auto *CB = dyn_cast<CallBase>(&
I))
1243 Worklist.
append(SCC.begin(), SCC.end());
1244 while (!Worklist.
empty()) {
1250 if (
auto *UsrI = dyn_cast<Instruction>(U.getUser()))
1251 if (Seen.
insert(UsrI->getFunction()).second)
1252 Worklist.
push_back(UsrI->getFunction());
1269 return getFunctionInfo(
F).OpcodeInstMap;
1274 return getFunctionInfo(
F).RWInsts;
1293 FunctionInfo &FI = getFunctionInfo(*
Arg.getParent());
1294 return FI.CalledViaMustTail || FI.ContainsMustTailCall;
1298 return AssumeOnlyValues.contains(&
I);
1302 template <
typename AP>
1316 auto It = BESets.find(BES);
1317 if (It != BESets.end())
1320 bool Success = BESets.insert(UniqueBES).second;
1340 struct FunctionInfo {
1352 bool CalledViaMustTail;
1355 bool ContainsMustTailCall;
1359 DenseMap<const Function *, FunctionInfo *> FuncInfoMap;
1362 FunctionInfo &getFunctionInfo(
const Function &
F) {
1363 FunctionInfo *&FI = FuncInfoMap[&
F];
1365 FI =
new (Allocator) FunctionInfo();
1366 initializeInformationCache(
F, *FI);
1375 void initializeInformationCache(
const Function &
F, FunctionInfo &FI);
1378 const DataLayout &DL;
1384 MustBeExecutedContextExplorer Explorer;
1390 SetVector<const Instruction *> AssumeOnlyValues;
1393 DenseSet<const AA::InstExclusionSetTy *> BESets;
1399 SmallPtrSet<const Function *, 8> InlineableFunctions;
1402 Triple TargetTriple;
1496 InfoCache(InfoCache), Configuration(Configuration) {}
1528 template <
typename AAType>
1531 return getOrCreateAAFor<AAType>(IRP, &QueryingAA, DepClass,
1540 template <
typename AAType>
1543 return getOrCreateAAFor<AAType>(IRP, &QueryingAA, DepClass,
1552 template <
typename AAType>
1555 DepClassTy DepClass,
bool ForceUpdate =
false,
1556 bool UpdateAfterInit =
true) {
1557 if (!shouldPropagateCallBaseContext(IRP))
1560 if (AAType *AAPtr = lookupAAFor<AAType>(IRP, QueryingAA, DepClass,
1562 if (ForceUpdate && Phase == AttributorPhase::UPDATE)
1569 auto &AA = AAType::createForPosition(IRP, *
this);
1576 if (Phase == AttributorPhase::SEEDING && !shouldSeedAttribute(AA)) {
1577 AA.getState().indicatePessimisticFixpoint();
1599 AA.getState().indicatePessimisticFixpoint();
1605 ++InitializationChainLength;
1606 AA.initialize(*
this);
1607 --InitializationChainLength;
1614 AA.getState().indicatePessimisticFixpoint();
1620 if (Phase == AttributorPhase::MANIFEST ||
1621 Phase == AttributorPhase::CLEANUP) {
1622 AA.getState().indicatePessimisticFixpoint();
1628 if (UpdateAfterInit) {
1629 AttributorPhase OldPhase = Phase;
1630 Phase = AttributorPhase::UPDATE;
1642 template <
typename AAType>
1644 return getOrCreateAAFor<AAType>(IRP,
nullptr,
1650 template <
typename AAType>
1654 bool AllowInvalidState =
false) {
1655 static_assert(std::is_base_of<AbstractAttribute, AAType>::value,
1656 "Cannot query an attribute with a type not derived from "
1657 "'AbstractAttribute'!");
1664 AAType *AA =
static_cast<AAType *
>(AAPtr);
1673 if (!AllowInvalidState && !AA->getState().isValidState())
1703 static_assert(std::is_base_of<AbstractAttribute, AAType>::value,
1704 "Cannot register an attribute with a type not derived from "
1705 "'AbstractAttribute'!");
1711 assert(!AAPtr &&
"Attribute already in map!");
1715 if (Phase == AttributorPhase::SEEDING || Phase == AttributorPhase::UPDATE)
1731 return Functions.
empty() || Functions.
count(Fn);
1751 return F.hasExactDefinition() || InfoCache.InlineableFunctions.count(&
F);
1760 "Only local linkage is assumed dead initially.");
1779 Value *&V = ToBeChangedUses[&U];
1780 if (V && (V->stripPointerCasts() == NV.stripPointerCasts() ||
1781 isa_and_nonnull<UndefValue>(V)))
1783 assert((!V || V == &NV || isa<UndefValue>(NV)) &&
1784 "Use was registered twice for replacement with different values!");
1793 bool ChangeDroppable =
true) {
1795 auto *CB = cast<CallBase>(IRP.
getCtxI());
1800 auto &Entry = ToBeChangedValues[&V];
1801 Value *CurNV = get<0>(Entry);
1803 isa<UndefValue>(CurNV)))
1805 assert((!CurNV || CurNV == &NV || isa<UndefValue>(NV)) &&
1806 "Value replacement was registered twice with different values!");
1807 Entry = {&NV, ChangeDroppable};
1814 ToBeChangedToUnreachableInsts.insert(
I);
1821 InvokeWithDeadSuccessor.insert(&II);
1835 ManifestAddedBlocks.insert(&BB);
1841 ToBeDeletedFunctions.insert(&
F);
1848 bool &UsedAssumedInformation);
1851 bool &UsedAssumedInformation) {
1859 bool &UsedAssumedInformation,
1865 bool &UsedAssumedInformation,
1868 UsedAssumedInformation, S);
1877 bool &UsedAssumedInformation,
1890 bool &UsedAssumedInformation);
1901 SimplificationCallbacks[IRP].emplace_back(CB);
1906 return SimplificationCallbacks.count(IRP);
1913 std::function<std::optional<Constant *>(
1918 GlobalVariableSimplificationCallbacks[&GV].emplace_back(CB);
1923 return GlobalVariableSimplificationCallbacks.count(&GV);
1929 std::optional<Constant *>
1932 bool &UsedAssumedInformation) {
1933 assert(GlobalVariableSimplificationCallbacks.contains(&GV));
1934 for (
auto &CB : GlobalVariableSimplificationCallbacks.lookup(&GV)) {
1935 auto SimplifiedGV = CB(GV, AA, UsedAssumedInformation);
1937 assert(SimplifiedGV.has_value() &&
"SimplifiedGV has not value");
1938 return *SimplifiedGV;
1947 VirtualUseCallbacks[&V].emplace_back(CB);
1953 SimplificationCallbacks;
1959 GlobalVariableSimplificationCallbacks;
1962 VirtualUseCallbacks;
1966 std::optional<Value *>
1969 bool &UsedAssumedInformation);
1975 bool &UsedAssumedInformation,
1976 bool CheckBBLivenessOnly =
false,
1983 const AAIsDead *LivenessAA,
bool &UsedAssumedInformation,
1984 bool CheckBBLivenessOnly =
false,
1986 bool CheckForDeadStore =
false);
1992 const AAIsDead *FnLivenessAA,
bool &UsedAssumedInformation,
1993 bool CheckBBLivenessOnly =
false,
2000 const AAIsDead *FnLivenessAA,
bool &UsedAssumedInformation,
2001 bool CheckBBLivenessOnly =
false,
2022 bool CheckBBLivenessOnly =
false,
2024 bool IgnoreDroppableUses =
true,
2026 EquivalentUseCB =
nullptr);
2039 template <
typename RemarkKind,
typename RemarkCallBack>
2041 RemarkCallBack &&RemarkCB)
const {
2050 return RemarkCB(RemarkKind(Configuration.
PassName, RemarkName,
I))
2051 <<
" [" << RemarkName <<
"]";
2055 return RemarkCB(RemarkKind(Configuration.
PassName, RemarkName,
I));
2060 template <
typename RemarkKind,
typename RemarkCallBack>
2062 RemarkCallBack &&RemarkCB)
const {
2070 return RemarkCB(RemarkKind(Configuration.
PassName, RemarkName,
F))
2071 <<
" [" << RemarkName <<
"]";
2075 return RemarkCB(RemarkKind(Configuration.
PassName, RemarkName,
F));
2117 return ReplacementTypes;
2131 ReplacementTypes(ReplacementTypes.begin(), ReplacementTypes.end()),
2132 CalleeRepairCB(
std::
move(CalleeRepairCB)),
2133 ACSRepairCB(
std::
move(ACSRepairCB)) {}
2189 bool RequireAllCallSites,
2190 bool &UsedAssumedInformation);
2200 const Function &Fn,
bool RequireAllCallSites,
2202 bool &UsedAssumedInformation,
2203 bool CheckPotentiallyDead =
false);
2231 bool &UsedAssumedInformation,
2232 bool CheckBBLivenessOnly =
false,
2233 bool CheckPotentiallyDead =
false);
2242 bool &UsedAssumedInformation,
2243 bool CheckBBLivenessOnly =
false,
2244 bool CheckPotentiallyDead =
false);
2251 bool &UsedAssumedInformation,
2252 bool CheckBBLivenessOnly =
false,
2253 bool CheckPotentiallyDead =
false) {
2256 {(
unsigned)Instruction::Invoke, (
unsigned)Instruction::CallBr,
2258 UsedAssumedInformation, CheckBBLivenessOnly, CheckPotentiallyDead);
2268 bool &UsedAssumedInformation);
2334 void runTillFixpoint();
2346 void identifyDeadInternalFunctions();
2354 void rememberDependences();
2357 bool shouldPropagateCallBaseContext(
const IRPosition &IRP);
2373 using AAMapKeyTy = std::pair<const char *, IRPosition>;
2379 ArgumentReplacementMap;
2432 enum class AttributorPhase {
2437 } Phase = AttributorPhase::SEEDING;
2440 unsigned InitializationChainLength = 0;
2445 SmallPtrSet<BasicBlock *, 8> ManifestAddedBlocks;
2446 SmallSetVector<Function *, 8> ToBeDeletedFunctions;
2447 SmallSetVector<BasicBlock *, 8> ToBeDeletedBlocks;
2448 SmallSetVector<WeakVH, 8> ToBeDeletedInsts;
2453 SmallSetVector<AbstractAttribute *, 16> QueryAAsAwaitingUpdate;
2456 const AttributorConfig Configuration;
2459 friend AttributorCallGraph;
2517template <
typename base_ty, base_ty BestState, base_ty WorstState>
2571 return !(*
this == R);
2589 joinOR(R.getAssumed(), R.getKnown());
2593 joinAND(R.getAssumed(), R.getKnown());
2617template <
typename base_ty =
uint32_t, base_ty BestState = ~base_ty(0),
2618 base_ty WorstState = 0>
2628 return (this->
Known & BitsEncoding) == BitsEncoding;
2633 return (this->
Assumed & BitsEncoding) == BitsEncoding;
2640 this->
Known |= Bits;
2663 void handleNewAssumedValue(
base_t Value)
override {
2667 void joinOR(
base_t AssumedValue,
base_t KnownValue)
override {
2668 this->
Known |= KnownValue;
2669 this->
Assumed |= AssumedValue;
2671 void joinAND(
base_t AssumedValue,
base_t KnownValue)
override {
2672 this->
Known &= KnownValue;
2673 this->
Assumed &= AssumedValue;
2679template <
typename base_ty =
uint32_t, base_ty BestState = ~base_ty(0),
2680 base_ty WorstState = 0>
2712 void handleNewAssumedValue(
base_t Value)
override {
2716 void joinOR(
base_t AssumedValue,
base_t KnownValue)
override {
2717 this->
Known = std::max(this->
Known, KnownValue);
2720 void joinAND(
base_t AssumedValue,
base_t KnownValue)
override {
2721 this->
Known = std::min(this->
Known, KnownValue);
2728template <
typename base_ty = u
int32_t>
2748 void handleNewAssumedValue(
base_t Value)
override {
2752 void joinOR(
base_t AssumedValue,
base_t KnownValue)
override {
2756 void joinAND(
base_t AssumedValue,
base_t KnownValue)
override {
2786 void handleNewAssumedValue(
base_t Value)
override {
2790 void handleNewKnownValue(
base_t Value)
override {
2794 void joinOR(
base_t AssumedValue,
base_t KnownValue)
override {
2795 Known |= KnownValue;
2798 void joinAND(
base_t AssumedValue,
base_t KnownValue)
override {
2799 Known &= KnownValue;
2826 return ConstantRange::getFull(
BitWidth);
2831 return ConstantRange::getEmpty(
BitWidth);
2926 : Universal(
false), Set(Assumptions) {}
2929 : Universal(Universal), Set(Assumptions) {}
2940 bool IsUniversal = Universal;
2944 if (
RHS.isUniversal())
2953 Universal &=
RHS.isUniversal();
2954 return IsUniversal != Universal ||
Size != Set.
size();
2960 bool IsUniversal = Universal;
2964 if (!
RHS.isUniversal() && !Universal)
2967 Universal |=
RHS.isUniversal();
2968 return IsUniversal != Universal ||
Size != Set.
size();
2984 : Known(Known), Assumed(
true), IsAtFixedpoint(
false) {}
2994 IsAtFixedpoint =
true;
3001 IsAtFixedpoint =
true;
3020 unsigned SizeBefore = Assumed.
getSet().
size();
3027 return SizeBefore != Assumed.
getSet().
size();
3039 SetContents Assumed;
3041 bool IsAtFixedpoint;
3049 bool ForceReplace =
false);
3069template <Attribute::AttrKind AK,
typename BaseType>
3075 const IRPosition &IRP = this->getIRPosition();
3079 this->getState().indicateOptimisticFixpoint();
3092 if (IsFnInterface && (!FnScope || !
A.isFunctionIPOAmendable(*FnScope)))
3093 this->getState().indicatePessimisticFixpoint();
3098 if (isa<UndefValue>(this->getIRPosition().getAssociatedValue()))
3262template <
typename base_ty, base_ty BestState, base_ty WorstState>
3269raw_ostream &
operator<<(raw_ostream &
OS,
const IntegerRangeState &State);
3283template <
typename StateType>
3285 auto Assumed = S.getAssumed();
3297 :
public IRAttribute<Attribute::Returned, AbstractAttribute> {
3326 const std::string
getName()
const override {
return "AAReturnedValues"; }
3343 StateWrapper<BooleanState, AbstractAttribute>> {
3356 const std::string
getName()
const override {
return "AANoUnwind"; }
3372 StateWrapper<BooleanState, AbstractAttribute>> {
3400 const std::string
getName()
const override {
return "AANoSync"; }
3417 StateWrapper<BooleanState, AbstractAttribute>> {
3431 const std::string
getName()
const override {
return "AAMustProgress"; }
3449 StateWrapper<BooleanState, AbstractAttribute>> {
3462 const std::string
getName()
const override {
return "AANonNull"; }
3479 StateWrapper<BooleanState, AbstractAttribute>> {
3492 const std::string
getName()
const override {
return "AANoRecurse"; }
3509 StateWrapper<BooleanState, AbstractAttribute>> {
3522 const std::string
getName()
const override {
return "AAWillReturn"; }
3538 :
public StateWrapper<BooleanState, AbstractAttribute> {
3559 const std::string
getName()
const override {
return "AAUndefinedBehavior"; }
3576 :
public StateWrapper<BooleanState, AbstractAttribute> {
3592 const std::string
getName()
const override {
return "AAIntraFnReachability"; }
3610 StateWrapper<BooleanState, AbstractAttribute>> {
3623 const std::string
getName()
const override {
return "AANoAlias"; }
3640 StateWrapper<BooleanState, AbstractAttribute>> {
3653 const std::string
getName()
const override {
return "AANoFree"; }
3670 StateWrapper<BooleanState, AbstractAttribute>> {
3683 const std::string
getName()
const override {
return "AANoReturn"; }
3699 :
public StateWrapper<BitIntegerState<uint8_t, 3, 0>, AbstractAttribute> {
3742 "Instruction must be in the same anchor scope function.");
3770 const std::string
getName()
const override {
return "AAIsDead"; }
3795 DS.indicatePessimisticFixpoint();
3832 void computeKnownDerefBytesFromAccessedMap() {
3835 if (KnownBytes < Access.first)
3837 KnownBytes = std::max(KnownBytes, Access.first + (int64_t)Access.second);
3870 void takeKnownDerefBytesMaximum(
uint64_t Bytes) {
3874 computeKnownDerefBytesFromAccessedMap();
3878 void takeAssumedDerefBytesMinimum(
uint64_t Bytes) {
3885 AccessedBytes = std::max(AccessedBytes,
Size);
3888 computeKnownDerefBytesFromAccessedMap();
3893 return this->DerefBytesState ==
R.DerefBytesState &&
3894 this->GlobalState ==
R.GlobalState;
3898 bool operator!=(
const DerefState &R)
const {
return !(*
this ==
R); }
3903 GlobalState ^=
R.GlobalState;
3910 GlobalState +=
R.GlobalState;
3917 GlobalState &=
R.GlobalState;
3924 GlobalState |=
R.GlobalState;
3929 const AANonNull *NonNullAA =
nullptr;
3935 StateWrapper<DerefState, AbstractAttribute>> {
3940 return NonNullAA && NonNullAA->isAssumedNonNull();
3945 return NonNullAA && NonNullAA->isKnownNonNull();
3971 const std::string
getName()
const override {
return "AADereferenceable"; }
3990 Attribute::Alignment,
3991 StateWrapper<AAAlignmentStateType, AbstractAttribute>> {
4001 const std::string
getName()
const override {
return "AAAlign"; }
4043 const std::string
getName()
const override {
return "AAInstanceInfo"; }
4061 Attribute::NoCapture,
4062 StateWrapper<BitIntegerState<uint16_t, 7, 0>, AbstractAttribute>> {
4106 const std::string
getName()
const override {
return "AANoCapture"; }
4134 DS.indicatePessimisticFixpoint();
4196 :
public StateWrapper<ValueSimplifyStateType, AbstractAttribute, Type *> {
4206 const std::string
getName()
const override {
return "AAValueSimplify"; }
4226 virtual std::optional<Value *>
4227 getAssumedSimplifiedValue(
Attributor &
A)
const = 0;
4247 const std::string
getName()
const override {
return "AAHeapToStack"; }
4272 :
public StateWrapper<BooleanState, AbstractAttribute> {
4292 const std::string
getName()
const override {
return "AAPrivatizablePtr"; }
4311 Attribute::ReadNone,
4312 StateWrapper<BitIntegerState<uint8_t, 3>, AbstractAttribute>> {
4355 const std::string
getName()
const override {
return "AAMemoryBehavior"; }
4374 Attribute::ReadNone,
4375 StateWrapper<BitIntegerState<uint32_t, 511>, AbstractAttribute>> {