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();
20 if (has_common_prev_sync || is_kernel_start) return rewrite(sync_work_items->arg());
21 }
22 return Super::rewrite_imm_App(app);
23}
24
25} // namespace mim::plug::gpu::phase
static auto isa(const Def *def)
Definition axm.h:112
Base class for all Defs.
Definition def.h:289
bool is_external() const noexcept
Definition def.h:569
Extracts from a Sigma or Array-typed Extract::tuple the element at position Extract::index.
Definition tuple.h:360
const Def * tuple() const
Definition tuple.h:370
const Def * rewrite_imm_App(const App *) override
Definition phase.cpp:223
virtual const Def * rewrite(const Def *)
Definition rewrite.cpp:62
A variable introduced by a binder (mutable).
Definition def.h:857
Def * binder() const
The binder of this Var.
Definition def.h:867
const Def * rewrite_imm_App(const App *) final