1 | #include <cassert> |
---|---|
2 | #include <iostream> |
3 | #include <algorithm> |
4 | #include "triton/ir/value.h" |
5 | #include "triton/ir/instructions.h" |
6 | |
7 | namespace triton{ |
8 | namespace ir{ |
9 | |
10 | class type; |
11 | |
12 | //===----------------------------------------------------------------------===// |
13 | // value class |
14 | //===----------------------------------------------------------------------===// |
15 | |
16 | value::value(type *ty, const std::string &name): ty_(ty){ |
17 | set_name(name); |
18 | } |
19 | |
20 | void value::add_use(user *arg) { |
21 | users_.push_back(arg); |
22 | } |
23 | |
24 | value::users_t::iterator value::erase_use(user *arg){ |
25 | auto it = std::find(users_.begin(), users_.end(), arg); |
26 | if(it == users_.end()) |
27 | return it; |
28 | return users_.erase(it); |
29 | } |
30 | |
31 | // TODO: automatic naming scheme + update symbol table |
32 | void value::set_name(const std::string &name){ |
33 | name_ = name; |
34 | } |
35 | |
36 | void value::replace_all_uses_with(value *target){ |
37 | for (auto it = users_.begin(); it != users_.end(); ) { |
38 | it = (*it)->replace_uses_of_with(this, target); |
39 | } |
40 | } |
41 | |
42 | |
43 | void visitor::visit_value(ir::value* v) { |
44 | v->accept(this); |
45 | } |
46 | |
47 | |
48 | //===----------------------------------------------------------------------===// |
49 | // user class |
50 | //===----------------------------------------------------------------------===// |
51 | void user::set_operand(unsigned i, value *x) { |
52 | assert(i < ops_.size() && "set_operand() out of range!"); |
53 | ops_[i] = x; |
54 | x->add_use(this); |
55 | } |
56 | |
57 | value* user::get_operand(unsigned i) const { |
58 | assert(i < ops_.size() && "get_operand() out of range!"); |
59 | return ops_[i]; |
60 | } |
61 | |
62 | unsigned user::get_num_operands() const { |
63 | return num_ops_; |
64 | } |
65 | |
66 | unsigned user::get_num_hidden() const { |
67 | return num_hidden_; |
68 | } |
69 | |
70 | value::users_t::iterator user::replace_uses_of_with(value *before, value *after) { |
71 | for(size_t i = 0; i < ops_.size(); i++) |
72 | if(ops_[i] == before){ |
73 | ops_[i] = after; |
74 | after->add_use(this); |
75 | } |
76 | return before->erase_use(this); |
77 | } |
78 | |
79 | |
80 | |
81 | } |
82 | } |
83 |