58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
![]() |
#include <climits>
|
||
|
#include <iostream>
|
||
|
#include "triton/codegen/analysis/liveness.h"
|
||
|
#include "triton/codegen/analysis/layout.h"
|
||
|
#include "triton/ir/function.h"
|
||
|
#include "triton/ir/module.h"
|
||
|
#include "triton/ir/utils.h"
|
||
|
|
||
|
namespace triton{
|
||
|
namespace codegen{
|
||
|
namespace analysis{
|
||
|
|
||
|
|
||
|
void liveness::run(ir::module &mod) {
|
||
|
intervals_.clear();
|
||
|
|
||
|
// Assigns index to each instruction
|
||
|
std::map<ir::value*, slot_index> indices;
|
||
|
for(ir::function *fn: mod.get_function_list()){
|
||
|
slot_index index = 0;
|
||
|
for(ir::basic_block *block: fn->blocks())
|
||
|
for(ir::instruction *instr: block->get_inst_list()){
|
||
|
index += 1;
|
||
|
indices.insert({instr, index});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// create live intervals
|
||
|
for(auto &x: layouts_->get_all()) {
|
||
|
shared_layout* layout = x.second->to_shared();
|
||
|
if(!layout)
|
||
|
continue;
|
||
|
// users
|
||
|
std::set<ir::user*> users;
|
||
|
for(ir::value *v: layout->get_values()){
|
||
|
for(ir::user *u: v->get_users())
|
||
|
users.insert(u);
|
||
|
}
|
||
|
// compute intervals
|
||
|
unsigned start = INT32_MAX;
|
||
|
for(ir::value *v: layout->get_values())
|
||
|
if(indices.find(v) != indices.end())
|
||
|
start = std::min(start, indices.at(v));
|
||
|
unsigned end = 0;
|
||
|
for(ir::user *u: users)
|
||
|
if(indices.find(u) != indices.end())
|
||
|
end = std::max(end, indices.at(u));
|
||
|
intervals_[layout] = segment{start, end};
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|