1#include <cassert>
2#include <iostream>
3#include <algorithm>
4#include "triton/ir/value.h"
5#include "triton/ir/instructions.h"
6
7namespace triton{
8namespace ir{
9
10class type;
11
12//===----------------------------------------------------------------------===//
13// value class
14//===----------------------------------------------------------------------===//
15
16value::value(type *ty, const std::string &name): ty_(ty){
17 set_name(name);
18}
19
20void value::add_use(user *arg) {
21 users_.push_back(arg);
22}
23
24value::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
32void value::set_name(const std::string &name){
33 name_ = name;
34}
35
36void 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
43void visitor::visit_value(ir::value* v) {
44 v->accept(this);
45}
46
47
48//===----------------------------------------------------------------------===//
49// user class
50//===----------------------------------------------------------------------===//
51void 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
57value* user::get_operand(unsigned i) const {
58 assert(i < ops_.size() && "get_operand() out of range!");
59 return ops_[i];
60}
61
62unsigned user::get_num_operands() const {
63 return num_ops_;
64}
65
66unsigned user::get_num_hidden() const {
67 return num_hidden_;
68}
69
70value::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