Author: Yuan Suo
Date: 2026-08-08T23:52:53+02:00
New Revision: 0aeb516dccab806616070123bd504bdd544cc39d

URL: 
https://github.com/llvm/llvm-project/commit/0aeb516dccab806616070123bd504bdd544cc39d
DIFF: 
https://github.com/llvm/llvm-project/commit/0aeb516dccab806616070123bd504bdd544cc39d.diff

LOG: [LifetimeSafety] Use ImmutableList for buildOriginFlowChain DFS nodes 
(#208890)

This commit mainly address the suggestion in
https://github.com/llvm/llvm-project/pull/204592#discussion_r3523582077
to use `ImmutableList` for the DFS nodes in `buildOriginFlowChain`, and
also updates the `llvm_unreachable` messages.

---------

Signed-off-by: Yuan Suo <[email protected]>
Co-authored-by: Utkarsh Saxena <[email protected]>

Added: 
    

Modified: 
    clang/lib/Analysis/LifetimeSafety/LoanPropagation.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Analysis/LifetimeSafety/LoanPropagation.cpp 
b/clang/lib/Analysis/LifetimeSafety/LoanPropagation.cpp
index cab409e3b8b5a..a11f1cca25aca 100644
--- a/clang/lib/Analysis/LifetimeSafety/LoanPropagation.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/LoanPropagation.cpp
@@ -5,6 +5,7 @@
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 
//===----------------------------------------------------------------------===//
+#include <algorithm>
 #include <cassert>
 #include <memory>
 
@@ -18,6 +19,7 @@
 #include "clang/Analysis/CFG.h"
 #include "clang/Basic/LLVM.h"
 #include "llvm/ADT/BitVector.h"
+#include "llvm/ADT/ImmutableList.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/raw_ostream.h"
@@ -175,12 +177,14 @@ class AnalysisImpl
     using SearchState = std::pair<const CFGBlock *, OriginID>;
     struct DFSNode {
       SearchState CurrState;
-      llvm::SmallVector<OriginID> OriginFlowChain;
+      llvm::ImmutableList<OriginID> OriginFlowChain;
     };
 
     llvm::SmallVector<DFSNode> PendingStates;
     llvm::SmallSet<SearchState, 16> VistedStates;
-    PendingStates.push_back({{EndBlock, StartOID}, {}});
+    llvm::ImmutableList<OriginID>::Factory OriginFlowChainFactory;
+    PendingStates.push_back(
+        {{EndBlock, StartOID}, OriginFlowChainFactory.getEmptyList()});
 
     // DFS loop to trace loan backwards through CFG
     while (!PendingStates.empty()) {
@@ -191,13 +195,19 @@ class AnalysisImpl
       const auto [BuildResult, Complete] =
           buildOriginFlowChain(CurrBlock, CurrOID, TargetLoan);
       if (!BuildResult.empty()) {
-        CurrNode.OriginFlowChain.append(BuildResult);
+        for (OriginID OID : BuildResult)
+          CurrNode.OriginFlowChain =
+              OriginFlowChainFactory.add(OID, CurrNode.OriginFlowChain);
         CurrOID = BuildResult.back();
       }
 
       // If we found the IssueFact, we're done
-      if (Complete)
-        return CurrNode.OriginFlowChain;
+      if (Complete) {
+        llvm::SmallVector<OriginID> Result(CurrNode.OriginFlowChain.begin(),
+                                           CurrNode.OriginFlowChain.end());
+        std::reverse(Result.begin(), Result.end());
+        return Result;
+      }
 
       // Only explore predecessor blocks where the target loan is present in 
the
       // current origin.
@@ -209,8 +219,8 @@ class AnalysisImpl
       }
     }
 
-    llvm_unreachable(
-        "buildOriginFlowChain did not reach IssueFact for TargetLoan");
+    llvm_unreachable("Could not reconstruct origin flow. Search finished "
+                     "without reaching IssueFact");
   }
 
   llvm::SmallVector<OriginID> buildOriginFlowChain(const UseFact *UF,


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to