MimIR
0.4-dev
MimIR is my Intermediate Representation
Toggle main menu visibility
Loading...
Searching...
No Matches
branch_normalize.cpp
Go to the documentation of this file.
1
#include "
mim/phase/branch_normalize.h
"
2
3
#include "
mim/lam.h
"
4
5
namespace
mim
{
6
7
const
Def
*
BranchNormalize::rewrite_mut_Lam
(
Lam
* lam) {
8
if
(lam->
is_set
()) {
9
if
(
auto
br =
Branch
(lam->
body
())) {
10
auto
tt = br.tt()->isa<
Lam
>() ? br.tt() :
Lam::eta_expand
(br.tt());
11
auto
ff = br.ff()->isa<
Lam
>() ? br.ff() :
Lam::eta_expand
(br.ff());
12
13
if
(tt != br.tt() || ff != br.ff()) {
14
log
().d(
"branch-normalize: tt {} → {}, ff {} → {}"
, br.tt(), tt, br.ff(), ff);
15
lam->
branch
(lam->
filter
(), br.cond(), tt, ff, br.arg());
16
// if we have this pattern nested, it will work recursively due to the rewrite of the new stuff below
17
}
18
}
19
}
20
21
return
RWPhase::rewrite_mut_Lam(lam);
22
}
23
24
}
// namespace mim
branch_normalize.h
mim::BranchNormalize::rewrite_mut_Lam
const Def * rewrite_mut_Lam(Lam *) final
Definition
branch_normalize.cpp:7
mim::Branch::Branch
Branch(const Def *)
Definition
tuple.cpp:24
mim::Def
Base class for all Defs.
Definition
def.h:273
mim::Def::is_set
bool is_set() const
Definition
def.h:370
mim::Lam
A function.
Definition
lam.h:113
mim::Lam::filter
const Def * filter() const
Definition
lam.h:125
mim::Lam::eta_expand
static Lam * eta_expand(Filter, const Def *f)
Definition
lam.cpp:56
mim::Lam::branch
Lam * branch(Filter filter, const Def *cond, const Def *t, const Def *f, const Def *arg=nullptr)
Set body to an App of (f, t)#cond mem or (f, t)#cond () if mem is nullptr.
Definition
lam.cpp:33
mim::Lam::body
const Def * body() const
Definition
lam.h:126
mim::Phase::log
const fe::Log & log() const
Definition
phase.h:79
lam.h
mim
Definition
ast.h:16
src
mim
phase
branch_normalize.cpp
Generated by
1.18.0