MimIR
0.4-dev
MimIR is my Intermediate Representation
Toggle main menu visibility
Loading...
Searching...
No Matches
normalizers.cpp
Go to the documentation of this file.
1
#include <
mim/world.h
>
2
3
#include "
mim/plug/mem/mem.h
"
4
5
namespace
mim::plug::mem
{
6
7
const
Def
*
normalize_lea
(
const
Def
*,
const
Def
*,
const
Def
* arg) {
8
auto
[ptr, index] = arg->
projs
<2>();
9
auto
[
pointee
, addr_space] =
Axm::as<Ptr>
(ptr->type())->args<2>();
10
11
if
(
auto
a =
Lit::isa
(
pointee
->
arity
()); a && *a == 1)
return
ptr;
12
13
return
{};
14
}
15
16
const
Def
*
normalize_load
(
const
Def
* type,
const
Def
*,
const
Def
* arg) {
17
auto
& world = type->world();
18
auto
[
mem
, ptr] = arg->
projs
<2>();
19
auto
[
pointee
, addr_space] =
Axm::as<Ptr>
(ptr->type())->args<2>();
20
21
if
(ptr->isa<
Bot
>())
return
world.tuple({
mem
, world.bot(type->as<
Sigma
>()->
op
(1))});
22
23
// loading an empty tuple can only result in an empty tuple
24
// TODO use common singleton magic here
25
if
(
auto
sigma =
pointee
->isa<
Sigma
>(); sigma && sigma->
num_ops
() == 0)
26
return
world.tuple({
mem
, world.tuple(sigma->type(), {})});
27
28
return
{};
29
}
30
31
const
Def
*
normalize_remem
(
const
Def
*,
const
Def
*,
const
Def
*) {
return
{}; }
32
33
const
Def
*
normalize_store
(
const
Def
*,
const
Def
*,
const
Def
* arg) {
34
auto
[
mem
, ptr, val] = arg->
projs
<3>();
35
36
if
(ptr->isa<
Bot
>() || val->isa<
Bot
>())
return
mem
;
37
if
(
auto
pack = val->isa<
Pack
>(); pack && pack->
body
()->isa<
Bot
>())
return
mem
;
38
if
(
auto
tuple
= val->isa<
Tuple
>()) {
39
if
(std::ranges::all_of(
tuple
->ops(), [](
const
Def
* op) { return op->isa<Bot>(); }))
return
mem
;
40
}
41
42
return
{};
43
}
44
45
MIM_mem_NORMALIZER_IMPL
46
47
}
// namespace mim::plug::mem
mim::Axm::as
static auto as(const Def *def)
Definition
axm.h:134
mim::Def
Base class for all Defs.
Definition
def.h:273
mim::Def::op
const Def * op(size_t i) const noexcept
Definition
def.h:351
mim::Def::projs
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
Definition
def.h:440
mim::Def::arity
const Def * arity() const
Number of elements available to Extract / Insert (may be dynamic).
Definition
def.cpp:592
mim::Def::num_ops
constexpr size_t num_ops() const noexcept
Definition
def.h:352
mim::Lit::isa
static std::optional< T > isa(const Def *def)
Definition
def.h:937
mim::Pack
A (possibly paramterized) Tuple.
Definition
tuple.h:137
mim::Seq::body
const Def * body() const
Definition
tuple.h:85
mim::Sigma
A dependent tuple type.
Definition
tuple.h:23
mim::Tuple
Data constructor for a Sigma.
Definition
tuple.h:61
MIM_mem_NORMALIZER_IMPL
#define MIM_mem_NORMALIZER_IMPL
Definition
autogen.h:137
mem.h
mim::plug::mem
The mem Plugin
Definition
mem.h:11
mim::plug::mem::normalize_lea
const Def * normalize_lea(const Def *, const Def *, const Def *arg)
Definition
normalizers.cpp:7
mim::plug::mem::normalize_remem
const Def * normalize_remem(const Def *, const Def *, const Def *)
Definition
normalizers.cpp:31
mim::plug::mem::normalize_store
const Def * normalize_store(const Def *, const Def *, const Def *arg)
Definition
normalizers.cpp:33
mim::plug::mem::normalize_load
const Def * normalize_load(const Def *type, const Def *, const Def *arg)
Definition
normalizers.cpp:16
mim::plug::mem::pointee
const Def * pointee(const Def *ptr)
Definition
mem.h:104
mim::plug::tuple
The tuple Plugin
Definition
normalizers.cpp:6
mim::Bot
TExt< false > Bot
Definition
lattice.h:164
world.h
src
mim
plug
mem
normalizers.cpp
Generated by
1.18.0