#ifndef wasm_dataflow_users_h
#define wasm_dataflow_users_h
#include "dataflow/graph.h"
namespace wasm::DataFlow {
class Users {
using UserSet = std::unordered_set<DataFlow::Node*>;
std::unordered_map<DataFlow::Node*, UserSet> users;
public:
void build(Graph& graph) {
for (auto& node : graph.nodes) {
for (auto* value : node->values) {
users[value].insert(node.get());
}
}
}
UserSet& getUsers(Node* node) {
auto iter = users.find(node);
if (iter == users.end()) {
static UserSet empty; return empty;
}
return iter->second;
}
Index getNumUses(Node* node) {
auto& users = getUsers(node);
Index numUses = 0;
for (auto* user : users) {
#ifndef NDEBUG
bool found = false;
#endif
for (auto* value : user->values) {
if (value == node) {
numUses++;
#ifndef NDEBUG
found = true;
#endif
}
}
assert(found);
}
return numUses;
}
void stopUsingValues(Node* node) {
for (auto* value : node->values) {
auto& users = getUsers(value);
users.erase(node);
}
}
void addUser(Node* node, Node* newUser) { users[node].insert(newUser); }
void removeAllUsesOf(Node* node) { users.erase(node); }
};
}
#endif