Files
triton/lib/codegen/analysis/liveness.cc

63 lines
1.4 KiB
C++
Raw Normal View History

2019-09-14 02:36:11 -04:00
#include <iostream>
#include <climits>
#include <unordered_set>
#include "triton/codegen/instructions.h"
#include "triton/codegen/analysis/liveness.h"
2019-10-09 15:05:44 -04:00
#include "triton/codegen/analysis/layout.h"
#include "triton/codegen/transform/cts.h"
2019-02-24 14:20:40 -05:00
#include "triton/ir/basic_block.h"
#include "triton/ir/function.h"
#include "triton/ir/module.h"
#include "triton/ir/instructions.h"
#include "triton/ir/value.h"
#include "triton/ir/utils.h"
2019-01-07 22:49:37 -05:00
namespace triton{
2019-01-07 22:49:37 -05:00
namespace codegen{
namespace analysis{
2019-01-07 22:49:37 -05:00
void liveness::run(ir::module &mod) {
intervals_.clear();
// Assigns index to each instruction
2019-10-12 01:25:08 -04:00
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});
}
}
2019-10-12 01:25:08 -04:00
// create live intervals
2019-10-11 19:05:54 -04:00
for(auto &x: layouts_->get_all()) {
layout_t* layout = x.second;
if(layout->type != SHARED)
continue;
// users
std::set<ir::user*> users;
2019-10-11 19:05:54 -04:00
for(ir::value *v: layout->values){
for(ir::user *u: v->get_users())
2019-10-11 19:05:54 -04:00
users.insert(u);
2019-01-07 22:49:37 -05:00
}
// compute intervals
unsigned start = INT32_MAX;
unsigned end = 0;
for(ir::user *u: users)
if(indices.find(u) != indices.end()){
start = std::min(start, indices.at(u));
end = std::max(end, indices.at(u));
}
2019-10-11 19:05:54 -04:00
intervals_[layout] = segment{start, end};
2019-01-07 22:49:37 -05:00
}
2019-10-07 18:06:54 -04:00
2019-01-07 22:49:37 -05:00
}
}
}
}