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
