================
@@ -204,22 +209,72 @@ class AnalysisImpl
llvm::SmallVector<OriginID>
buildOriginFlowChain(ProgramPoint StartPoint, const OriginID StartOID,
- const LoanID TargetLoan) const {
+ const LoanID TargetLoan,
+ const PostOrderCFGView *POV) const {
assert(getLoans(StartOID, StartPoint).contains(TargetLoan) &&
"TargetLoan must be present in the StartOID at the StartPoint");
+ std::optional<OriginID> FinalOID;
+ llvm::DenseMap<OriginID, OriginID> VistedOriginIDs;
+
+ const auto OriginFlowChainFilter = [&VistedOriginIDs](OriginID FinalOID) {
+ llvm::SmallVector<OriginID> OriginFlowChain;
+ while (true) {
+ OriginFlowChain.push_back(FinalOID);
+ const auto NextOriginID = VistedOriginIDs.find(FinalOID);
+ if (NextOriginID == VistedOriginIDs.end())
+ break;
+ FinalOID = NextOriginID->second;
+ }
+ return OriginFlowChain;
+ };
+
+ const auto InsertVistedOriginIDs =
+ [&VistedOriginIDs, &FinalOID](llvm::ArrayRef<OriginID> OriginFlowChain,
+ OriginID &StartOID) {
+ if (!VistedOriginIDs.empty())
+ VistedOriginIDs.insert({OriginFlowChain[0], StartOID});
+
+ for (size_t i = 0; i < OriginFlowChain.size() - 1; ++i)
+ VistedOriginIDs.insert(
+ {OriginFlowChain[i + 1], OriginFlowChain[i]});
+
+ StartOID = OriginFlowChain.back();
+ FinalOID = StartOID;
+ };
+
+ std::optional<size_t> BlockID = FactMgr.getBlockID(StartPoint);
+ assert(BlockID.has_value());
+ const auto StartIt = llvm::find_if(*POV, [&BlockID](const CFGBlock *Block)
{
+ return Block->getBlockID() == BlockID;
+ });
+
+ OriginID CurrOID = StartOID;
+ for (const CFGBlock *B :
+ llvm::reverse(llvm::make_range(POV->begin(), StartIt + 1))) {
+ BuildOriginFlowChainResult BuildResult =
+ buildOriginFlowChain(B, CurrOID, TargetLoan);
+ if (!BuildResult.OriginFlowChain.empty())
+ InsertVistedOriginIDs(BuildResult.OriginFlowChain, CurrOID);
+ if (BuildResult.Complete)
+ return OriginFlowChainFilter(*FinalOID);
+ }
+
+ llvm_unreachable(
+ "buildOriginFlowChain should return at BuildResult.Complete");
+ }
+
+ BuildOriginFlowChainResult
+ buildOriginFlowChain(const CFGBlock *Block, const OriginID StartOID,
+ const LoanID TargetLoan) const {
----------------
NeKon69 wrote:
Also I think it would be cleaner to make this a private method
https://github.com/llvm/llvm-project/pull/204592
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits