================
@@ -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

Reply via email to