MimIR 0.1
MimIR is my Intermediate Representation
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
5namespace mim::plug::mem {
6
7Ref normalize_lea(Ref type, Ref callee, Ref arg) {
8 auto& world = type->world();
9 auto [ptr, index] = arg->projs<2>();
10 auto [pointee, addr_space] = force<Ptr>(ptr->type())->args<2>();
11
12 if (auto a = Lit::isa(pointee->arity()); a && *a == 1) return ptr;
13 // TODO
14
15 return world.raw_app(type, callee, {ptr, index});
16}
17
18Ref normalize_load(Ref type, Ref callee, Ref arg) {
19 auto& world = type->world();
20 auto [mem, ptr] = arg->projs<2>();
21 auto [pointee, addr_space] = force<Ptr>(ptr->type())->args<2>();
22
23 if (ptr->isa<Bot>()) return world.tuple({mem, world.bot(type->as<Sigma>()->op(1))});
24
25 // loading an empty tuple can only result in an empty tuple
26 if (auto sigma = pointee->isa<Sigma>(); sigma && sigma->num_ops() == 0)
27 return world.tuple({mem, world.tuple(sigma->type(), {})});
28
29 return world.raw_app(type, callee, {mem, ptr});
30}
31
32Ref normalize_remem(Ref type, Ref callee, Ref mem) {
33 auto& world = type->world();
34
35 // if (auto m = match<remem>(mem)) mem = m;
36 return world.raw_app(type, callee, mem);
37}
38
39Ref normalize_store(Ref type, Ref callee, Ref arg) {
40 auto& world = type->world();
41 auto [mem, ptr, val] = arg->projs<3>();
42
43 if (ptr->isa<Bot>() || val->isa<Bot>()) return mem;
44 if (auto pack = val->isa<Pack>(); pack && pack->body()->isa<Bot>()) return mem;
45 if (auto tuple = val->isa<Tuple>()) {
46 if (std::ranges::all_of(tuple->ops(), [](Ref op) { return op->isa<Bot>(); })) return mem;
47 }
48
49 return world.raw_app(type, callee, {mem, ptr, val});
50}
51
53
54} // namespace mim::plug::mem
size_t num_ops() const
Definition def.h:267
const Def * op(size_t i) const
Definition def.h:266
World & world() const
Definition def.cpp:417
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == -1_n) or std::array (otherwise).
Definition def.h:364
static std::optional< T > isa(Ref def)
Definition def.h:712
A (possibly paramterized) Tuple.
Definition tuple.h:88
const Def * body() const
Definition tuple.h:98
Helper class to retrieve Infer::arg if present.
Definition def.h:85
A dependent tuple type.
Definition tuple.h:9
Extremum. Either Top (Up) or Bottom.
Definition lattice.h:130
Data constructor for a Sigma.
Definition tuple.h:40
Ref raw_app(Ref type, Ref callee, Ref arg)
Definition world.cpp:218
#define MIM_mem_NORMALIZER_IMPL
Definition autogen.h:282
The mem Plugin
Definition mem.h:10
Ref normalize_lea(Ref type, Ref callee, Ref arg)
Ref normalize_remem(Ref type, Ref callee, Ref mem)
Ref normalize_store(Ref type, Ref callee, Ref arg)
Ref normalize_load(Ref type, Ref callee, Ref arg)
auto force(Ref def)
Definition axiom.h:126