mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[WIP][Attributor] AAReachability Attribute
Summary: Working towards Johannes's suggestion for fixme, in Attributor's Noalias attribute deduction. (ii) Check whether the value is captured in the scope using AANoCapture. FIXME: This is conservative though, it is better to look at CFG and // check only uses possibly executed before this call site. A Reachability abstract attribute answers the question "does execution at point A potentially reach point B". If this question is answered with false for all other uses of the value that might be captured, we know it is not *yet* captured and can continue with the noalias deduction. Currently, information AAReachability provides is completely pessimistic. Reviewers: jdoerfert Reviewed By: jdoerfert Subscribers: uenoku, sstefan1, hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D70233
This commit is contained in:
parent
9e97862e1f
commit
6e5fd6e850
@ -1682,6 +1682,37 @@ struct AAWillReturn
|
||||
static const char ID;
|
||||
};
|
||||
|
||||
/// An abstract interface to determine reachability of point A to B.
|
||||
struct AAReachability : public StateWrapper<BooleanState, AbstractAttribute>,
|
||||
public IRPosition {
|
||||
AAReachability(const IRPosition &IRP) : IRPosition(IRP) {}
|
||||
|
||||
/// Returns true if 'From' instruction is assumed to reach, 'To' instruction.
|
||||
/// Users should provide two positions they are interested in, and the class
|
||||
/// determines (and caches) reachability.
|
||||
bool isAssumedReachable(const Instruction *From,
|
||||
const Instruction *To) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Returns true if 'From' instruction is known to reach, 'To' instruction.
|
||||
/// Users should provide two positions they are interested in, and the class
|
||||
/// determines (and caches) reachability.
|
||||
bool isKnownReachable(const Instruction *From, const Instruction *To) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Return an IR position, see struct IRPosition.
|
||||
const IRPosition &getIRPosition() const override { return *this; }
|
||||
|
||||
/// Create an abstract attribute view for the position \p IRP.
|
||||
static AAReachability &createForPosition(const IRPosition &IRP,
|
||||
Attributor &A);
|
||||
|
||||
/// Unique ID (due to the unique address)
|
||||
static const char ID;
|
||||
};
|
||||
|
||||
/// An abstract interface for all noalias attributes.
|
||||
struct AANoAlias
|
||||
: public IRAttribute<Attribute::NoAlias,
|
||||
|
@ -2051,6 +2051,34 @@ struct AAWillReturnCallSite final : AAWillReturnImpl {
|
||||
void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(willreturn); }
|
||||
};
|
||||
|
||||
/// -------------------AAReachability Attribute--------------------------
|
||||
|
||||
struct AAReachabilityImpl : AAReachability {
|
||||
AAReachabilityImpl(const IRPosition &IRP) : AAReachability(IRP) {}
|
||||
|
||||
const std::string getAsStr() const override {
|
||||
// TODO: Return the number of reachable queries.
|
||||
return "reachable";
|
||||
}
|
||||
|
||||
/// See AbstractAttribute::initialize(...).
|
||||
void initialize(Attributor &A) override {
|
||||
indicatePessimisticFixpoint();
|
||||
}
|
||||
|
||||
/// See AbstractAttribute::updateImpl(...).
|
||||
ChangeStatus updateImpl(Attributor &A) override {
|
||||
return indicatePessimisticFixpoint();
|
||||
}
|
||||
};
|
||||
|
||||
struct AAReachabilityFunction final : public AAReachabilityImpl {
|
||||
AAReachabilityFunction(const IRPosition &IRP) : AAReachabilityImpl(IRP) {}
|
||||
|
||||
/// See AbstractAttribute::trackStatistics()
|
||||
void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(reachable); }
|
||||
};
|
||||
|
||||
/// ------------------------ NoAlias Argument Attribute ------------------------
|
||||
|
||||
struct AANoAliasImpl : AANoAlias {
|
||||
@ -5680,6 +5708,7 @@ const char AANonNull::ID = 0;
|
||||
const char AANoRecurse::ID = 0;
|
||||
const char AAWillReturn::ID = 0;
|
||||
const char AANoAlias::ID = 0;
|
||||
const char AAReachability::ID = 0;
|
||||
const char AANoReturn::ID = 0;
|
||||
const char AAIsDead::ID = 0;
|
||||
const char AADereferenceable::ID = 0;
|
||||
@ -5799,6 +5828,7 @@ CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAIsDead)
|
||||
CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoFree)
|
||||
|
||||
CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAHeapToStack)
|
||||
CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReachability)
|
||||
|
||||
CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryBehavior)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user