4#include <unordered_map>
5#include <unordered_set>
7#include <boost/functional/hash.hpp>
26 std::vector<std::unique_ptr<User>> users_;
29 std::vector<User*> order_;
30 std::unordered_map<const structured_control_flow::ControlFlowNode*, std::pair<size_t, size_t>> ranges_;
32 std::unordered_map<const structured_control_flow::ControlFlowNode*, bool> may_return_;
33 std::unordered_map<const structured_control_flow::ControlFlowNode*, std::vector<size_t>> loop_conditions_;
41 bool operator==(
const UserKey& other)
const =
default;
45 std::size_t operator()(
const UserKey& k)
const {
46 std::size_t h = k.element_id;
47 boost::hash_combine(h,
static_cast<int>(k.use));
48 boost::hash_combine(h, k.loop_part);
53 static UserKey user_key(Element* element,
Use use,
bool is_init,
bool is_condition,
bool is_update);
55 std::unordered_map<UserKey, std::vector<User*>, UserKeyHash> users_lookup_;
58 struct ContainerUsers {
59 std::vector<User*>
uses;
60 std::vector<User*>
reads;
62 std::vector<User*>
views;
63 std::vector<User*>
moves;
66 std::unordered_map<std::string, ContainerUsers> container_users_;
68 const ContainerUsers& container_users(
const std::string& container)
const;
71 std::vector<std::pair<structured_control_flow::ControlFlowNode*, size_t>> traversal_stack_;
73 void on_enter(structured_control_flow::ControlFlowNode& node)
override;
74 void on_leave(structured_control_flow::ControlFlowNode& node)
override;
75 void on_use(
const std::string& container, Element* element,
Use use,
LoopPart part)
override;
77 void add_user(std::unique_ptr<User> user);
80 using Node = structured_control_flow::ControlFlowNode;
82 bool traversed(
const Node& node)
const;
84 const Node* child_towards(
const Node& ancestor,
const Node* node)
const;
86 const Node* common_ancestor(
const User& a,
const User& b)
const;
88 bool may_return(
const Node& node);
90 const std::vector<size_t>& loop_conditions(
const structured_control_flow::StructuredLoop& loop);
92 bool must_exit(
const User& a,
const Node& region);
94 bool no_escape(
const User& b,
const Node& region);
96 bool post_dominates_entry(
const User& a,
const Node& region);
99 using Interval = std::pair<size_t, size_t>;
101 size_t loop_reentry(
const structured_control_flow::StructuredLoop& loop);
103 void forward_intervals(
const User& user,
const Node& stop,
bool cut_at_stop, std::vector<Interval>& out);
105 void exit_intervals(
const User& user,
const Node& region, std::vector<Interval>& out);
107 void entry_intervals(
const User& user,
const Node& region, std::vector<Interval>& out);
109 std::unordered_set<User*>
110 collect_uses(
const std::vector<Interval>& intervals,
const User* skip1,
const User* skip2,
bool skip_returns)
const;
117 std::string
name()
const override {
124 const std::string& container,
127 bool is_init =
false,
128 bool is_condition =
false,
129 bool is_update =
false
133 const std::string& container,
136 bool is_init =
false,
137 bool is_condition =
false,
138 bool is_update =
false
143 std::vector<User*>
uses()
const;
145 std::vector<User*>
uses(
const std::string& container)
const;
147 size_t num_uses(
const std::string& container)
const;
151 const std::vector<User*>&
writes(
const std::string& container)
const;
157 const std::vector<User*>&
reads(
const std::string& container)
const;
163 const std::vector<User*>&
views(
const std::string& container)
const;
169 const std::vector<User*>&
moves(
const std::string& container)
const;
204 std::vector<User*>
uses()
const;
206 std::vector<User*>
uses(
const std::string& container)
const;
210 std::vector<User*>
writes(
const std::string& container)
const;
214 std::vector<User*>
reads(
const std::string& container)
const;
218 std::vector<User*>
views(
const std::string& container)
const;
222 std::vector<User*>
moves(
const std::string& container)
const;
Definition structured_sdfg.h:30
UsersView(Users &users, const structured_control_flow::ControlFlowNode &node)
Users(StructuredSDFG &sdfg)
Base class for all structured control flow nodes in a StructuredSDFG.
Definition control_flow_node.h:44
LoopPart
Definition legacy_user_visitor.h:16
std::vector< User * > uses(const std::string &container) const
std::vector< User * > uses() const
std::vector< User * > views(const std::string &container) const
std::vector< User * > moves(const std::string &container) const
bool contains(const User &user) const
std::vector< User * > writes(const std::string &container) const
const std::vector< std::string > all_containers_in_order()
std::vector< User * > reads() const
std::vector< User * > views() const
UsersView(Users &users, const structured_control_flow::ControlFlowNode &node)
std::vector< User * > moves() const
std::vector< User * > reads(const std::string &container) const
std::vector< User * > writes() const
std::unordered_set< User * > all_uses_after(User &user)
friend class UsersView
Definition users.h:21
std::vector< User * > writes() const
std::unordered_set< std::string > locals(structured_control_flow::ControlFlowNode &node)
static structured_control_flow::ControlFlowNode * scope(User *user)
std::vector< User * > views() const
const std::vector< User * > & writes(const std::string &container) const
Users(StructuredSDFG &sdfg, structured_control_flow::ControlFlowNode &node)
size_t num_views(const std::string &container) const
std::vector< User * > reads() const
const std::vector< User * > & views(const std::string &container) const
User * get_user(const std::string &container, Element *element, Use use, bool is_init=false, bool is_condition=false, bool is_update=false)
const std::unordered_set< User * > all_uses_between(User &user1, User &user2)
std::vector< User * > uses(const std::string &container) const
const std::vector< User * > & moves(const std::string &container) const
const std::unordered_set< User * > all_uses_after(User &user)
void run(analysis::AnalysisManager &analysis_manager) override
std::vector< User * > moves() const
Users(StructuredSDFG &sdfg)
size_t num_moves(const std::string &container) const
size_t num_uses(const std::string &container) const
const std::vector< std::string > all_containers_in_order()
bool dominates(User &user1, User &user2)
Strict dominance between two users, derived from.
std::string name() const override
Definition users.h:117
const std::vector< User * > & reads(const std::string &container) const
bool post_dominates(User &user1, User &user2)
Strict post-dominance between two users, derived from the structured control flow.
std::vector< User * > uses() const
size_t num_reads(const std::string &container) const
bool has_user(const std::string &container, Element *element, Use use, bool is_init=false, bool is_condition=false, bool is_update=false)
size_t num_writes(const std::string &container) const
Definition base_user_visitor.h:5