Skip to content

[CodeGen][SDAG] Remove Combiner WorklistMap #92900

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 5, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions llvm/include/llvm/CodeGen/SelectionDAGNodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,9 @@ END_TWO_BYTE_PACK()
/// Unique id per SDNode in the DAG.
int NodeId = -1;

/// Index in worklist of DAGCombiner, or -1.
int CombinerWorklistIndex = -1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this increase the size of the node, or does it fill a hole (when pointers are 64-bit)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fills 4 padding bytes, the size of an SDNode remains unchanged at 88 bytes (x86-64).


/// The values that are used by this operation.
SDUse *OperandList = nullptr;

Expand Down Expand Up @@ -747,6 +750,12 @@ END_TWO_BYTE_PACK()
/// Set unique node id.
void setNodeId(int Id) { NodeId = Id; }

/// Get worklist index for DAGCombiner
int getCombinerWorklistIndex() const { return CombinerWorklistIndex; }

/// Set worklist index for DAGCombiner
void setCombinerWorklistIndex(int Index) { CombinerWorklistIndex = Index; }

/// Return the node ordering.
unsigned getIROrder() const { return IROrder; }

Expand Down
28 changes: 12 additions & 16 deletions llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,16 +170,11 @@ namespace {
/// back and when processing we pop off of the back.
///
/// The worklist will not contain duplicates but may contain null entries
/// due to nodes being deleted from the underlying DAG.
/// due to nodes being deleted from the underlying DAG. For fast lookup and
/// deduplication, the index of the node in this vector is stored in the
/// node in SDNode::CombinerWorklistIndex.
SmallVector<SDNode *, 64> Worklist;

/// Mapping from an SDNode to its position on the worklist.
///
/// This is used to find and remove nodes from the worklist (by nulling
/// them) when they are deleted from the underlying DAG. It relies on
/// stable indices of nodes within the worklist.
DenseMap<SDNode *, unsigned> WorklistMap;

/// This records all nodes attempted to be added to the worklist since we
/// considered a new worklist entry. As we keep do not add duplicate nodes
/// in the worklist, this is different from the tail of the worklist.
Expand Down Expand Up @@ -238,10 +233,9 @@ namespace {
}

if (N) {
bool GoodWorklistEntry = WorklistMap.erase(N);
(void)GoodWorklistEntry;
assert(GoodWorklistEntry &&
assert(N->getCombinerWorklistIndex() >= 0 &&
"Found a worklist entry without a corresponding map entry!");
N->setCombinerWorklistIndex(-1);
}
return N;
}
Expand Down Expand Up @@ -285,8 +279,10 @@ namespace {
if (IsCandidateForPruning)
ConsiderForPruning(N);

if (WorklistMap.insert(std::make_pair(N, Worklist.size())).second)
if (N->getCombinerWorklistIndex() == -1) {
N->setCombinerWorklistIndex(Worklist.size());
Worklist.push_back(N);
}
}

/// Remove all instances of N from the worklist.
Expand All @@ -295,13 +291,13 @@ namespace {
PruningList.remove(N);
StoreRootCountMap.erase(N);

auto It = WorklistMap.find(N);
if (It == WorklistMap.end())
int WorklistIndex = N->getCombinerWorklistIndex();
if (WorklistIndex == -1)
return; // Not in the worklist.

// Null out the entry rather than erasing it to avoid a linear operation.
Worklist[It->second] = nullptr;
WorklistMap.erase(It);
Worklist[WorklistIndex] = nullptr;
N->setCombinerWorklistIndex(-1);
}

void deleteAndRecombine(SDNode *N);
Expand Down