================
@@ -202,53 +203,76 @@ class AnalysisImpl
return getLoans(getState(P), OID);
}
- llvm::SmallVector<OriginID>
- buildOriginFlowChain(ProgramPoint StartPoint, const OriginID StartOID,
- const LoanID TargetLoan) const {
+ llvm::SmallVector<OriginID> buildOriginFlowChain(ProgramPoint StartPoint,
+ const OriginID StartOID,
+ const LoanID TargetLoan,
+ const CFG *Cfg) const {
assert(getLoans(StartOID, StartPoint).contains(TargetLoan) &&
"TargetLoan must be present in the StartOID at the StartPoint");
- OriginID CurrOID = StartOID;
+ DEBUG_WITH_TYPE("LifetimeBuildOriginFlow",
+ llvm::dbgs()
+ << "==========================================\n"
+ << " Lifetime Analysis buildOriginFlow\n"
+ << "==========================================\n"
+ << "StartOriginID: " << StartOID
+ << ", TargetLoanID: " << TargetLoan << "\n\n");
+
+ const CFGBlock *EndBlock = nullptr;
+ size_t BlockID = FactMgr.getBlockID(StartPoint);
+ for (const CFGBlock *Block : *Cfg)
+ if (Block->getBlockID() == BlockID) {
+ EndBlock = Block;
+ break;
+ }
+
llvm::SmallVector<OriginID> OriginFlowChain;
- llvm::ArrayRef<const Fact *> Facts =
FactMgr.getBlockContaining(StartPoint);
- const auto *StartIt = llvm::find(Facts, StartPoint);
- assert(StartIt != Facts.end());
- for (const Fact *F :
- llvm::reverse(llvm::make_range(Facts.begin(), StartIt))) {
- if (const auto *IF = F->getAs<IssueFact>())
- if (IF->getLoanID() == TargetLoan) {
- assert(IF->getOriginID() == CurrOID);
- return OriginFlowChain;
- }
+ using SearchState = std::pair<const CFGBlock *, OriginID>;
----------------
usx95 wrote:
Some AI generated suggestion along the lines of my latest recommendation.
```cpp
using SearchState = std::pair<const CFGBlock *, OriginID>;
struct DFSState {
SearchState Curr;
llvm::SmallVector<OriginID> Chain;
};
llvm::SmallVector<DFSState> Stack;
llvm::SmallSet<SearchState, 16> VisitedStates;
Stack.push_back({{EndBlock, StartOID}, {}});
VisitedStates.insert({EndBlock, StartOID});
while (!Stack.empty()) {
DFSState State = Stack.pop_back_val();
const CFGBlock *CurrBlock = State.Curr.first;
OriginID CurrOID = State.Curr.second;
DEBUG_WITH_TYPE("LifetimeBuildOriginFlow",
llvm::dbgs() << "CurrBlockID: " << CurrBlock->getBlockID()
<< ", StartOriginID: " << CurrOID << "\n");
const auto [BuildResult, Complete] =
buildOriginFlowChain(CurrBlock, CurrOID, TargetLoan);
if (!BuildResult.empty()) {
State.Chain.append(BuildResult);
CurrOID = BuildResult.back();
}
if (Complete)
return std::move(State.Chain);
DEBUG_WITH_TYPE("LifetimeBuildOriginFlow",
llvm::dbgs() << "EndOriginID: " << CurrOID << "\n");
for (const CFGBlock *PredBlock : CurrBlock->preds()) {
if (!PredBlock)
continue;
// Prune dead ends: only explore predecessors that actually hold the
target loan
if (!getLoans(CurrOID, PredBlock).contains(TargetLoan))
continue;
SearchState NextState = {PredBlock, CurrOID};
if (VisitedStates.insert(NextState).second) {
Stack.push_back({NextState, State.Chain});
}
}
}
llvm_unreachable("buildOriginFlowChain did not reach IssueFact for
TargetLoan");
}
```
https://github.com/llvm/llvm-project/pull/204592
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits