more progress
This commit is contained in:
@@ -332,10 +332,10 @@ void grids::create_grids(std::vector<ir::value*> &grids,
|
|||||||
std::set<ir::value*> seen;
|
std::set<ir::value*> seen;
|
||||||
std::function<void(ir::value*)> bind_references = [&](ir::value *v)
|
std::function<void(ir::value*)> bind_references = [&](ir::value *v)
|
||||||
{
|
{
|
||||||
auto order = reorder_->get_order(v);
|
|
||||||
// skip
|
// skip
|
||||||
if(!v->get_type()->is_tile_ty() || !seen.insert(v).second)
|
if(!v->get_type()->is_tile_ty() || !seen.insert(v).second)
|
||||||
return;
|
return;
|
||||||
|
auto order = reorder_->get_order(v);
|
||||||
// recurse
|
// recurse
|
||||||
if(auto *user = dynamic_cast<ir::user*>(v))
|
if(auto *user = dynamic_cast<ir::user*>(v))
|
||||||
for(ir::value *op: user->ops())
|
for(ir::value *op: user->ops())
|
||||||
@@ -360,6 +360,7 @@ void grids::create_grids(std::vector<ir::value*> &grids,
|
|||||||
for(auto &ref: references)
|
for(auto &ref: references)
|
||||||
if(std::find(grids.begin(), grids.end(), ref.second) == grids.end())
|
if(std::find(grids.begin(), grids.end(), ref.second) == grids.end())
|
||||||
grids.push_back(ref.second);
|
grids.push_back(ref.second);
|
||||||
|
std::cout << grids.size() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -18,7 +18,6 @@ reorder::reorder(analysis::align* align, analysis::meminfo *mem)
|
|||||||
: align_(align), mem_(mem) { }
|
: align_(align), mem_(mem) { }
|
||||||
|
|
||||||
std::vector<unsigned> reorder::get_order(ir::value* v) {
|
std::vector<unsigned> reorder::get_order(ir::value* v) {
|
||||||
std::cout << v->get_name() << std::endl;
|
|
||||||
return order_.at(v);
|
return order_.at(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,6 +25,20 @@ void reorder::run(ir::module &mod) {
|
|||||||
|
|
||||||
std::set<ir::io_inst*> io;
|
std::set<ir::io_inst*> io;
|
||||||
|
|
||||||
|
std::function<void(ir::value*)> set_order = [&](ir::value *v) -> void {
|
||||||
|
if(order_.find(v) != order_.end())
|
||||||
|
return;
|
||||||
|
if(ir::user* u = dynamic_cast<ir::user*>(v))
|
||||||
|
for(ir::value* op: u->ops())
|
||||||
|
set_order(op);
|
||||||
|
ir::type* ty = v->get_type();
|
||||||
|
if(!ty->is_tile_ty())
|
||||||
|
return;
|
||||||
|
std::vector<unsigned> order(ty->get_tile_shapes().size());
|
||||||
|
std::iota(order.begin(), order.end(), 0);
|
||||||
|
order_[v] = order;
|
||||||
|
};
|
||||||
|
|
||||||
// initialize work-list
|
// initialize work-list
|
||||||
for(ir::function *fn: mod.get_function_list())
|
for(ir::function *fn: mod.get_function_list())
|
||||||
for(ir::basic_block *block: ir::cfg::reverse_post_order(fn))
|
for(ir::basic_block *block: ir::cfg::reverse_post_order(fn))
|
||||||
@@ -34,10 +47,8 @@ void reorder::run(ir::module &mod) {
|
|||||||
ir::type* ptr_ty = x->get_pointer_operand()->get_type();
|
ir::type* ptr_ty = x->get_pointer_operand()->get_type();
|
||||||
if(ptr_ty->is_tile_ty())
|
if(ptr_ty->is_tile_ty())
|
||||||
io.insert(x);
|
io.insert(x);
|
||||||
std::vector<unsigned> order(ptr_ty->get_tile_shapes().size());
|
|
||||||
std::iota(order.begin(), order.end(), 0);
|
|
||||||
order_[i] = order;
|
|
||||||
}
|
}
|
||||||
|
set_order(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
ir::builder &builder = mod.get_builder();
|
ir::builder &builder = mod.get_builder();
|
||||||
@@ -48,9 +59,8 @@ void reorder::run(ir::module &mod) {
|
|||||||
std::iota(order.begin(), order.end(), 0);
|
std::iota(order.begin(), order.end(), 0);
|
||||||
std::sort(order.begin(), order.end(), [&](unsigned a, unsigned b) { return max_contiguous[a] > max_contiguous[b]; } );
|
std::sort(order.begin(), order.end(), [&](unsigned a, unsigned b) { return max_contiguous[a] > max_contiguous[b]; } );
|
||||||
std::list<ir::instruction*> work_list;
|
std::list<ir::instruction*> work_list;
|
||||||
if(order != order_[i]){
|
if(order != order_[i])
|
||||||
work_list.push_back(i);
|
work_list.push_back(i);
|
||||||
}
|
|
||||||
// rematerialize recursively
|
// rematerialize recursively
|
||||||
while(!work_list.empty()) {
|
while(!work_list.empty()) {
|
||||||
ir::instruction* current = work_list.back();
|
ir::instruction* current = work_list.back();
|
||||||
|
@@ -210,9 +210,9 @@ std::unique_ptr<driver::module> function::make_bin(ir::module &module, driver::c
|
|||||||
peephole.run(module);
|
peephole.run(module);
|
||||||
dce.run(module);
|
dce.run(module);
|
||||||
alignment_info.run(module);
|
alignment_info.run(module);
|
||||||
ir::print(module, std::cout);
|
|
||||||
if(target->is_gpu())
|
if(target->is_gpu())
|
||||||
shmem_info.run(module);
|
shmem_info.run(module);
|
||||||
|
ir::print(module, std::cout);
|
||||||
reorder.run(module);
|
reorder.run(module);
|
||||||
dce.run(module);
|
dce.run(module);
|
||||||
ir::print(module, std::cout);
|
ir::print(module, std::cout);
|
||||||
|
Reference in New Issue
Block a user