28 explicit Lattice(
MovedLoansMap MovedLoans) : MovedLoans(MovedLoans) {}
33 return MovedLoans ==
Other.MovedLoans;
41 AnalysisImpl(
const CFG &
C, AnalysisDeclContext &AC, FactManager &F,
42 const LoanPropagationAnalysis &LoanPropagation,
43 const LiveOriginsAnalysis &LiveOrigins,
44 const LoanManager &LoanMgr,
45 MovedLoansMap::Factory &MovedLoansMapFactory)
46 : DataflowAnalysis(
C, AC, F), LoanPropagation(LoanPropagation),
47 LiveOrigins(LiveOrigins), LoanMgr(LoanMgr),
48 MovedLoansMapFactory(MovedLoansMapFactory) {}
52 StringRef getAnalysisName()
const {
return "MovedLoans"; }
54 Lattice getInitialState() {
return Lattice{}; }
58 Lattice join(Lattice A, Lattice B) {
60 A.MovedLoans, B.MovedLoans, MovedLoansMapFactory,
61 [](
const Expr *
const *MoveA,
const Expr *
const *MoveB) ->
const Expr * {
62 assert(MoveA || MoveB);
67 return (*MoveA)->getExprLoc() < (*MoveB)->getExprLoc() ? *MoveA
71 return Lattice(MovedLoans);
76 Lattice
transfer(Lattice In,
const MovedOriginFact &F) {
78 OriginID MovedOrigin = F.getMovedOrigin();
79 LoanSet ImmediatelyMovedLoans = LoanPropagation.getLoans(MovedOrigin, &F);
80 auto IsInvalidated = [&](
const AccessPath &Path) {
81 for (
LoanID LID : ImmediatelyMovedLoans) {
82 const Loan *MovedLoan = LoanMgr.getLoan(LID);
83 auto *PL = dyn_cast<PathLoan>(MovedLoan);
86 if (PL->getAccessPath() == Path)
91 for (
auto [O, _] : LiveOrigins.getLiveOriginsAt(&F))
92 for (
LoanID LiveLoan : LoanPropagation.getLoans(O, &F)) {
93 const Loan *LiveLoanPtr = LoanMgr.getLoan(LiveLoan);
94 auto *PL = dyn_cast<PathLoan>(LiveLoanPtr);
97 if (IsInvalidated(PL->getAccessPath()))
99 MovedLoansMapFactory.add(MovedLoans, LiveLoan, F.getMoveExpr());
101 return Lattice(MovedLoans);
107 const LoanPropagationAnalysis &LoanPropagation;
108 const LiveOriginsAnalysis &LiveOrigins;
109 const LoanManager &LoanMgr;
110 MovedLoansMap::Factory &MovedLoansMapFactory;
115 using AnalysisImpl::AnalysisImpl;
122 MovedLoansMap::Factory &MovedLoansMapFactory)
123 : PImpl(
std::make_unique<
Impl>(
C, AC, F, LoanPropagation, LiveOrigins,
124 LoanMgr, MovedLoansMapFactory)) {
131 return PImpl->getMovedLoans(P);
AnalysisDeclContext contains the context data for the function, method or block under analysis.
Represents a source-level, intra-procedural CFG that represents the control-flow of a Stmt.
A generic, policy-based driver for dataflow analyses.
Manages the creation, storage and retrieval of loans.
MovedLoansAnalysis(const CFG &C, AnalysisDeclContext &AC, FactManager &F, const LoanPropagationAnalysis &LoanPropagation, const LiveOriginsAnalysis &LiveOrigins, const LoanManager &LoanMgr, MovedLoansMap::Factory &MovedLoansMapFactory)
MovedLoansMap getMovedLoans(ProgramPoint P) const
void transfer(const StmtToEnvMap &StmtToEnv, const Stmt &S, Environment &Env, Environment::ValueModel &Model)
Evaluates S and updates Env accordingly.
@ Asymmetric
An asymmetric join preserves keys unique to the first map as-is, while applying the JoinValues operat...
static llvm::ImmutableSet< T > join(llvm::ImmutableSet< T > A, llvm::ImmutableSet< T > B, typename llvm::ImmutableSet< T >::Factory &F)
Computes the union of two ImmutableSets.
const Fact * ProgramPoint
A ProgramPoint identifies a location in the CFG by pointing to a specific Fact.
llvm::ImmutableSet< LoanID > LoanSet
utils::ID< struct LoanTag > LoanID
utils::ID< struct OriginTag > OriginID
llvm::ImmutableMap< LoanID, const Expr * > MovedLoansMap
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
bool operator!=(CanQual< T > x, CanQual< U > y)
@ Other
Other implicit parameter.