[clang] 0aeb516 - [LifetimeSafety] Use ImmutableList for buildOriginFlowChain DFS nodes (#208890)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 8 14:52:58 PDT 2026
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 <suoyuan666 at s5n.xyz>
Co-authored-by: Utkarsh Saxena <usx at google.com>
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,
More information about the cfe-commits
mailing list