[Mlir-commits] [mlir] fe42e63 - [mlir][NFC] Refactor `eraseState` to take constant time (#121670)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Jan 6 10:05:18 PST 2025
Author: Ian Wood
Date: 2025-01-06T10:05:14-08:00
New Revision: fe42e63d7b1bfb356a5209d3ced846695823b623
URL: https://github.com/llvm/llvm-project/commit/fe42e63d7b1bfb356a5209d3ced846695823b623
DIFF: https://github.com/llvm/llvm-project/commit/fe42e63d7b1bfb356a5209d3ced846695823b623.diff
LOG: [mlir][NFC] Refactor `eraseState` to take constant time (#121670)
Refactors `analysisStates` to use two nested maps . This prevents
`eraseState` from having to scan through every analysis state which can
be costly when there are many analysis states and/or `eraseState` is
called frequently.
Signed-off-by: Ian Wood <ianwood2024 at u.northwestern.edu>
Added:
Modified:
mlir/include/mlir/Analysis/DataFlowFramework.h
Removed:
################################################################################
diff --git a/mlir/include/mlir/Analysis/DataFlowFramework.h b/mlir/include/mlir/Analysis/DataFlowFramework.h
index dfd358e7017a4e..b6d10ba0bea2d8 100644
--- a/mlir/include/mlir/Analysis/DataFlowFramework.h
+++ b/mlir/include/mlir/Analysis/DataFlowFramework.h
@@ -332,9 +332,11 @@ class DataFlowSolver {
/// does not exist.
template <typename StateT, typename AnchorT>
const StateT *lookupState(AnchorT anchor) const {
- auto it =
- analysisStates.find({LatticeAnchor(anchor), TypeID::get<StateT>()});
- if (it == analysisStates.end())
+ const auto &mapIt = analysisStates.find(LatticeAnchor(anchor));
+ if (mapIt == analysisStates.end())
+ return nullptr;
+ auto it = mapIt->second.find(TypeID::get<StateT>());
+ if (it == mapIt->second.end())
return nullptr;
return static_cast<const StateT *>(it->second.get());
}
@@ -343,11 +345,7 @@ class DataFlowSolver {
template <typename AnchorT>
void eraseState(AnchorT anchor) {
LatticeAnchor la(anchor);
-
- for (auto it = analysisStates.begin(); it != analysisStates.end(); ++it) {
- if (it->first.first == la)
- analysisStates.erase(it);
- }
+ analysisStates.erase(LatticeAnchor(anchor));
}
// Erase all analysis states
@@ -426,7 +424,8 @@ class DataFlowSolver {
/// A type-erased map of lattice anchors to associated analysis states for
/// first-class lattice anchors.
- DenseMap<std::pair<LatticeAnchor, TypeID>, std::unique_ptr<AnalysisState>>
+ DenseMap<LatticeAnchor, DenseMap<TypeID, std::unique_ptr<AnalysisState>>,
+ DenseMapInfo<LatticeAnchor::ParentTy>>
analysisStates;
/// Allow the base child analysis class to access the internals of the solver.
@@ -643,7 +642,7 @@ AnalysisT *DataFlowSolver::load(Args &&...args) {
template <typename StateT, typename AnchorT>
StateT *DataFlowSolver::getOrCreateState(AnchorT anchor) {
std::unique_ptr<AnalysisState> &state =
- analysisStates[{LatticeAnchor(anchor), TypeID::get<StateT>()}];
+ analysisStates[LatticeAnchor(anchor)][TypeID::get<StateT>()];
if (!state) {
state = std::unique_ptr<StateT>(new StateT(anchor));
#if LLVM_ENABLE_ABI_BREAKING_CHECKS
@@ -689,10 +688,6 @@ struct DenseMapInfo<mlir::ProgramPoint> {
}
};
-template <>
-struct DenseMapInfo<mlir::LatticeAnchor>
- : public DenseMapInfo<mlir::LatticeAnchor::ParentTy> {};
-
// Allow llvm::cast style functions.
template <typename To>
struct CastInfo<To, mlir::LatticeAnchor>
More information about the Mlir-commits
mailing list