MimIR
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
remove_double_syncs.cpp
Go to the documentation of this file.
2
3#include <mim/axm.h>
4
5#include <mim/plug/mem/mem.h>
6
7namespace mim::plug::gpu::phase {
8
11 auto [m1, m3] = sync_work_items->args<2>();
12 auto m1_extract = m1->isa<Extract>();
13 auto m3_extract = m3->isa<Extract>();
14 if (!m1_extract || !m3_extract || m1_extract->tuple() != m3_extract->tuple())
15 return Super::rewrite_imm_App(app);
16 auto common_prev = m1_extract->tuple();
17 bool has_common_prev_sync = Axm::isa<gpu::sync_work_items>(common_prev);
18 auto common_var = common_prev->isa<Var>();
19 bool is_kernel_start = common_var ? common_var->binder()->is_external() : false;
20 if (has_common_prev_sync || is_kernel_start) {
21 auto new_arg = rewrite(sync_work_items->arg());
22 map(app, new_arg);
23 return new_arg;
24 }
25 }
26 return Super::rewrite_imm_App(app);
27}
28
29} // namespace mim::plug::gpu::phase
static auto isa(const Def *def)
Definition axm.h:107
Base class for all Defs.
Definition def.h:261
bool is_external() const noexcept
Definition def.h:500
Extracts from a Sigma or Array-typed Extract::tuple the element at position Extract::index.
Definition tuple.h:210
const Def * tuple() const
Definition tuple.h:220
virtual const Def * map(const Def *old_def, const Def *new_def)
Definition rewrite.h:45
virtual const Def * rewrite(const Def *)
Definition rewrite.cpp:56
A variable introduced by a binder (mutable).
Definition def.h:756
Def * binder() const
The binder of this Var.
Definition def.h:766
const Def * rewrite_imm_App(const App *) final