#include "gpu/intel/jit/pass/barrier.hpp"
#include "gemmstone/../../dsl/ir/pass/trace.hpp"
#include "gpu/intel/jit/ir/legacy.hpp"
namespace dnnl {
namespace impl {
namespace gpu {
namespace intel {
namespace jit {
class barrier_optimizer_t : public ir_mutator_t {
public:
object_t _mutate(const for_t &obj) override {
loop_level_++;
auto new_obj = ir_mutator_t::_mutate(obj);
loop_level_--;
return new_obj;
}
object_t _mutate(const func_call_t &obj) override {
if (is_func_call<send_t>(obj)) {
auto &send = obj.func.as<send_t>();
if (send.is_slm()) can_remove_barrier_ = false;
} else if (obj.func.is_same(funcs::barrier_func())) {
bool can_remove = can_remove_barrier_;
can_remove_barrier_ = false;
if (loop_level_ == 0 && can_remove) return stmt_t();
return obj;
}
return obj;
}
object_t _mutate(const store_t &obj) override { return obj; }
private:
int loop_level_ = 0;
bool can_remove_barrier_ = true;
};
stmt_t optimize_barrier(const stmt_t &s, ir_context_t &ir_ctx) {
ir::trace_start();
auto ret = barrier_optimizer_t().mutate(s);
ir::trace_pass("optimize_barrier", ret, ir_ctx);
return ret;
}
} } } } }