/// See AbstractAttribute::initialize(...).
void initialize(Attributor &A, InformationCache &InfoCache) override {
// Reset the state.
- AssociatedVal = nullptr;
+ setAssociatedValue(nullptr);
IsFixed = false;
IsValidState = true;
HasOverdefinedReturnedCalls = false;
ReturnedValues.clear();
- Function &F = cast<Function>(getAnchorValue());
+ Function &F = getAnchorScope();
// The map from instruction opcodes to those instructions in the function.
auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F);
struct AANonNullImpl : AANonNull {
IRPositionConstructorForward(AANonNullImpl, AANonNull);
-
/// See AbstractAttribute::getAsStr().
const std::string getAsStr() const override {
return getAssumed() ? "nonnull" : "may-null";
}
/// NonNull attribute for function return value.
-struct AANonNullReturned : AANonNullImpl {
-
+struct AANonNullReturned final : AANonNullImpl {
AANonNullReturned(Function &F) : AANonNullImpl(F, IRP_RETURNED) {}
- /// See AbstractAttriubute::initialize(...).
+ /// See AbstractAttribute::initialize(...).
void initialize(Attributor &A, InformationCache &InfoCache) override {
Function &F = getAnchorScope();
}
/// NonNull attribute for function argument.
-struct AANonNullArgument : AANonNullImpl {
-
+struct AANonNullArgument final : AANonNullImpl {
AANonNullArgument(Argument &A) : AANonNullImpl(A) {}
/// See AbstractAttriubute::initialize(...).
};
/// NonNull attribute for a call site argument.
-struct AANonNullCallSiteArgument : AANonNullImpl {
-
- /// See AANonNullImpl::AANonNullImpl(...).
+struct AANonNullCallSiteArgument final : AANonNullImpl {
AANonNullCallSiteArgument(Instruction &I, unsigned ArgNo)
: AANonNullImpl(CallSite(&I).getArgOperand(ArgNo), I, ArgNo) {}
ChangeStatus AANonNullArgument::updateImpl(Attributor &A,
InformationCache &InfoCache) {
Function &F = getAnchorScope();
- Argument &Arg = cast<Argument>(getAnchorValue());
-
- unsigned ArgNo = Arg.getArgNo();
+ unsigned ArgNo = getArgNo();
// Callback function
std::function<bool(CallSite)> CallSiteCheck = [&](CallSite CS) {
assert(CS && "Sanity check: Call site was not initialized properly!");
- auto *NonNullAA = A.getAAFor<AANonNull>(*this, *CS.getInstruction(), ArgNo);
+ auto *NonNullAA =
+ A.getAAFor<AANonNullImpl>(*this, *CS.getInstruction(), ArgNo);
// Check that NonNullAA is AANonNullCallSiteArgument.
if (NonNullAA) {
- ImmutableCallSite ICS(&NonNullAA->getIRPosition().getAnchorValue());
+ ImmutableCallSite ICS(&NonNullAA->getAnchorValue());
if (ICS && CS.getInstruction() == ICS.getInstruction())
return NonNullAA->isAssumedNonNull();
return false;
};
struct AAWillReturnFunction final : AAWillReturnImpl {
-
- /// See AbstractAttribute::AbstractAttribute(...).
AAWillReturnFunction(Function &F) : AAWillReturnImpl(F, IRP_FUNCTION) {}
/// See AbstractAttribute::initialize(...).
};
/// NoAlias attribute for function return value.
-struct AANoAliasReturned : AANoAliasImpl {
-
+struct AANoAliasReturned final : AANoAliasImpl {
AANoAliasReturned(Function &F) : AANoAliasImpl(F, IRP_RETURNED) {}
/// See AbstractAttriubute::initialize(...).
IRPositionConstructorForward(AAIsDeadImpl, AAIsDead);
void initialize(Attributor &A, InformationCache &InfoCache) override {
- Function &F = getAnchorScope();
+ const Function &F = getAnchorScope();
ToBeExploredPaths.insert(&(F.getEntryBlock().front()));
AssumedLiveBlocks.insert(&(F.getEntryBlock()));
/// starting from, thus including, \p I.
const Instruction *findNextNoReturn(Attributor &A, const Instruction *I);
+ /// See AbstractAttribute::getAsStr().
const std::string getAsStr() const override {
- return "LiveBBs(" + std::to_string(AssumedLiveBlocks.size()) + "/" +
- std::to_string(getAnchorScope().size()) + ")";
+ return "Live[#BB " + std::to_string(AssumedLiveBlocks.size()) + "/" +
+ std::to_string(getAnchorScope().size()) + "][#NRI " +
+ std::to_string(NoReturnCalls.size()) + "]";
}
/// See AbstractAttribute::manifest(...).
ChangeStatus HasChanged = ChangeStatus::UNCHANGED;
const Function &F = getAnchorScope();
- // Flag to determine if we can change an invoke to a call assuming the callee
- // is nounwind. This is not possible if the personality of the function allows
- // to catch asynchronous exceptions.
+ // Flag to determine if we can change an invoke to a call assuming the
+ // callee is nounwind. This is not possible if the personality of the
+ // function allows to catch asynchronous exceptions.
bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F);
for (const Instruction *NRC : NoReturnCalls) {
}
};
-struct AADereferenceableReturned : AADereferenceableImpl {
+struct AADereferenceableReturned final : AADereferenceableImpl {
AADereferenceableReturned(Function &F)
: AADereferenceableImpl(F, IRP_RETURNED) {}
return indicatePessimisticFixpoint();
}
-struct AADereferenceableArgument : AADereferenceableImpl {
+struct AADereferenceableArgument final : AADereferenceableImpl {
AADereferenceableArgument(Argument &A) : AADereferenceableImpl(A) {}
/// See AbstractAttribute::updateImpl(...).
}
/// Dereferenceable attribute for a call site argument.
-struct AADereferenceableCallSiteArgument : AADereferenceableImpl {
-
- /// See AADereferenceableImpl::AADereferenceableImpl(...).
+struct AADereferenceableCallSiteArgument final : AADereferenceableImpl {
AADereferenceableCallSiteArgument(Instruction &I, unsigned ArgNo)
: AADereferenceableImpl(CallSite(&I).getArgOperand(ArgNo), I, ArgNo) {}
// Max alignemnt value allowed in IR
static const unsigned MAX_ALIGN = 1U << 29;
- virtual const std::string getAsStr() const override {
+ const std::string getAsStr() const override {
return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) +
"-" + std::to_string(getAssumedAlign()) + ">")
: "unknown-align";
Function &F = getAnchorScope();
- unsigned AttrIdx = getIRPosition().getAttrIdx();
-
+ unsigned AttrIdx = getAttrIdx();
// Already the function has align attribute on return value or argument.
if (F.getAttributes().hasAttribute(AttrIdx, Attribute::Alignment))
addKnownBits(
/// Align attribute for function return value.
struct AAAlignReturned final : AAAlignImpl {
-
AAAlignReturned(Function &F) : AAAlignImpl(F, IRP_RETURNED) {}
/// See AbstractAttribute::updateImpl(...).
/// Align attribute for function argument.
struct AAAlignArgument final : AAAlignImpl {
-
AAAlignArgument(Argument &A) : AAAlignImpl(A) {}
/// See AbstractAttribute::updateImpl(...).
}
struct AAAlignCallSiteArgument final : AAAlignImpl {
-
- /// See AANonNullImpl::AANonNullImpl(...).
AAAlignCallSiteArgument(Instruction &I, unsigned ArgNo)
: AAAlignImpl(CallSite(&I).getArgOperand(ArgNo), I, ArgNo) {}