[CODEGEN] Removed dedicated reassociate pass to merge it into LLVM isel (#101)
This massively simplifies implementation of `reassociate` and also fixes a bunch of bug. The pass could still be improved, but can already be used to generate constant pointer offsets in eg the matmul epilogue
This commit is contained in:
committed by
Philippe Tillet
parent
e16bee1a27
commit
840140bf26
@@ -74,6 +74,33 @@ struct distributed_axis {
|
||||
Value* thread_id;
|
||||
};
|
||||
|
||||
class adder{
|
||||
public:
|
||||
adder(Builder** builder): builder_(builder) { }
|
||||
Value* operator()(Value* x, Value* y, const std::string& name = "");
|
||||
|
||||
private:
|
||||
Builder** builder_;
|
||||
};
|
||||
|
||||
class multiplier{
|
||||
public:
|
||||
multiplier(Builder** builder): builder_(builder) { }
|
||||
Value* operator()(Value* x, Value* y, const std::string& name = "");
|
||||
private:
|
||||
Builder** builder_;
|
||||
};
|
||||
|
||||
class geper{
|
||||
public:
|
||||
geper(Builder** builder): builder_(builder) { }
|
||||
Value* operator()(Value *ptr, Value* off, const std::string& name = "");
|
||||
Value* operator()(Type* ty, Value*ptr, std::vector<Value*> vals, const std::string& name = "");
|
||||
|
||||
private:
|
||||
Builder** builder_;
|
||||
};
|
||||
|
||||
class generator: public ir::visitor, public analysis::layout_visitor {
|
||||
private:
|
||||
void init_idx(ir::value *x);
|
||||
@@ -143,9 +170,9 @@ public:
|
||||
void visit_copy_from_shared_inst(ir::copy_from_shared_inst*);
|
||||
void visit_barrier_inst(ir::barrier_inst*);
|
||||
void visit_async_wait_inst(ir::async_wait_inst*);
|
||||
void visit_make_range_dyn(ir::make_range_dyn*);
|
||||
// void visit_make_range_dyn(ir::make_range_dyn*);
|
||||
void visit_make_range(ir::make_range*);
|
||||
void visit_make_range_sta(ir::make_range_sta*);
|
||||
// void visit_make_range_sta(ir::make_range_sta*);
|
||||
void visit_undef_value(ir::undef_value*);
|
||||
void visit_constant_int(ir::constant_int*);
|
||||
void visit_constant_fp(ir::constant_fp*);
|
||||
@@ -195,6 +222,11 @@ private:
|
||||
std::map<ir::value*, BasicBlock *> bbs_;
|
||||
std::map<ir::value*, std::vector<int>> ords_;
|
||||
|
||||
// helper for creating llvm values
|
||||
adder add;
|
||||
multiplier mul;
|
||||
geper gep;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@@ -1,49 +0,0 @@
|
||||
#ifndef TDL_INCLUDE_IR_CODEGEN_REASSOCIATE_H
|
||||
#define TDL_INCLUDE_IR_CODEGEN_REASSOCIATE_H
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
namespace triton {
|
||||
|
||||
// forward declaration
|
||||
namespace ir {
|
||||
class module;
|
||||
class value;
|
||||
class builder;
|
||||
class instruction;
|
||||
class getelementptr_inst;
|
||||
}
|
||||
|
||||
namespace codegen{
|
||||
|
||||
namespace analysis{
|
||||
class tiles;
|
||||
class align;
|
||||
}
|
||||
|
||||
namespace transform{
|
||||
|
||||
class reassociate {
|
||||
struct cst_info {
|
||||
ir::value* dyn_ptr;
|
||||
ir::getelementptr_inst* sta_ptr;
|
||||
};
|
||||
|
||||
private:
|
||||
ir::instruction* is_bin_add(ir::value *x);
|
||||
ir::value *reassociate_idx(ir::value *value, ir::builder &builder, ir::value *&noncst, ir::value *&cst);
|
||||
ir::value *reassociate_ptr(ir::getelementptr_inst* pz, ir::builder &builder, std::map<ir::value*, cst_info> &offsets);
|
||||
|
||||
public:
|
||||
void run(ir::module& module);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@@ -821,33 +821,33 @@ private:
|
||||
int N_;
|
||||
};
|
||||
|
||||
// On NVIDIA, implementation is such that
|
||||
// constant_range = nv_dynamic_program_idx + nv_static_program_idx
|
||||
// so as to enable re-association on nv_static_program_idx which is constant
|
||||
class make_range_dyn: public instruction {
|
||||
private:
|
||||
make_range_dyn(type *ty, const std::string &name, instruction *next);
|
||||
std::string repr_impl() const { return "nv_dynamic_program_idx"; }
|
||||
_TRITON_DEFINE_CLONE(make_range_dyn)
|
||||
_TRITON_DEFINE_ACCEPT(make_range_dyn)
|
||||
//// On NVIDIA, implementation is such that
|
||||
//// constant_range = nv_dynamic_program_idx + nv_static_program_idx
|
||||
//// so as to enable re-association on nv_static_program_idx which is constant
|
||||
//class make_range_dyn: public instruction {
|
||||
//private:
|
||||
// make_range_dyn(type *ty, const std::string &name, instruction *next);
|
||||
// std::string repr_impl() const { return "nv_dynamic_program_idx"; }
|
||||
// _TRITON_DEFINE_CLONE(make_range_dyn)
|
||||
// _TRITON_DEFINE_ACCEPT(make_range_dyn)
|
||||
|
||||
public:
|
||||
static make_range_dyn* create(type *ty, const std::string &name = "", instruction *next = nullptr);
|
||||
};
|
||||
//public:
|
||||
// static make_range_dyn* create(type *ty, const std::string &name = "", instruction *next = nullptr);
|
||||
//};
|
||||
|
||||
class make_range_sta: public constant {
|
||||
private:
|
||||
make_range_sta(make_range *range);
|
||||
//class make_range_sta: public constant {
|
||||
//private:
|
||||
// make_range_sta(make_range *range);
|
||||
|
||||
public:
|
||||
static make_range_sta *get(make_range* range);
|
||||
make_range* get_range() const;
|
||||
std::string repr() const { return "nv_static_program_idx"; }
|
||||
_TRITON_DEFINE_ACCEPT(make_range_sta)
|
||||
//public:
|
||||
// static make_range_sta *get(make_range* range);
|
||||
// make_range* get_range() const;
|
||||
// std::string repr() const { return "nv_static_program_idx"; }
|
||||
// _TRITON_DEFINE_ACCEPT(make_range_sta)
|
||||
|
||||
private:
|
||||
make_range *range_;
|
||||
};
|
||||
//private:
|
||||
// make_range *range_;
|
||||
//};
|
||||
|
||||
|
||||
/* constant range */
|
||||
|
@@ -144,12 +144,12 @@ public:
|
||||
virtual void visit_masked_load_async_inst(masked_load_async_inst*)= 0;
|
||||
virtual void visit_barrier_inst(barrier_inst*) = 0;
|
||||
virtual void visit_async_wait_inst(async_wait_inst*) = 0;
|
||||
virtual void visit_make_range_dyn(make_range_dyn*) = 0;
|
||||
// virtual void visit_make_range_dyn(make_range_dyn*) = 0;
|
||||
virtual void visit_make_range(make_range*) = 0;
|
||||
|
||||
virtual void visit_function(function*) = 0;
|
||||
|
||||
virtual void visit_make_range_sta(make_range_sta*) = 0;
|
||||
// virtual void visit_make_range_sta(make_range_sta*) = 0;
|
||||
virtual void visit_undef_value(undef_value*) = 0;
|
||||
virtual void visit_constant_int(constant_int*) = 0;
|
||||
virtual void visit_constant_fp(constant_fp*) = 0;
|
||||
|
Reference in New Issue
Block a user