[clang] [clang][dataflow] Add support for serialization and deserialization. (PR #152487)
Utkarsh Saxena via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 18 05:50:33 PDT 2025
================
@@ -208,6 +208,27 @@ bool DataflowAnalysisContext::equivalentFormulas(const Formula &Val1,
return isUnsatisfiable(std::move(Constraints));
}
+llvm::DenseSet<Atom> DataflowAnalysisContext::getTransitiveClosure(
+ const llvm::DenseSet<Atom> &Tokens) const {
+ llvm::DenseSet<Atom> VisitedTokens;
+ // Use a worklist algorithm, with `Remaining` holding the worklist.
+ std::vector<Atom> Remaining(Tokens.begin(), Tokens.end());
+
+ // For each token in `Remaining`, add its dependencies to the worklist.
+ while (!Remaining.empty()) {
+ auto Token = Remaining.back();
+ Remaining.pop_back();
+ if (!VisitedTokens.insert(Token).second)
+ continue;
+ if (auto DepsIt = FlowConditionDeps.find(Token);
+ DepsIt != FlowConditionDeps.end())
+ for (Atom A : DepsIt->second)
+ Remaining.push_back(A);
----------------
usx95 wrote:
If we talk about the latest suggestion, I don't see how we will push `B` again. The idea is that when we push a token, we mark it as `TokensSeen` before even visiting it. And if a token was already "seen" it is never pushed again.
| Current | TokensSeen | Remaining |
| :---------------- | :--------: | :-------: |
| initial condition | A | A |
| A | ABC | BC |
| B | ABC | C |
| C | ABC | null |
https://github.com/llvm/llvm-project/pull/152487
More information about the cfe-commits
mailing list