3#include <absl/container/fixed_array.h>
7const Def* SCCP::Analysis::join(
const Def* top,
const Def* def) {
8 auto [i, ins] = lattice_.emplace(top, def);
15 if (def->isa<
Bot>() || cur == def || cur == top)
return cur;
18 if (cur->isa<
Bot>())
return i->second = def;
19 return i->second =
top;
22Def* SCCP::Analysis::rewrite_mut(Def* mut) {
25 if (
auto var = mut->has_var()) {
29 for (
auto var : mut->tvars()) {
35 for (
auto d : mut->deps())
41const Def* SCCP::Analysis::rewrite_imm_App(
const App* app) {
43 auto n = app->num_targs();
44 auto abstr_args = absl::FixedArray<const Def*>(n);
45 auto abstr_vars = absl::FixedArray<const Def*>(n);
46 for (
size_t i = 0; i != n; ++i) {
47 auto abstr =
rewrite(app->targ(i));
48 abstr_vars[i] = join(lam->tvar(i), abstr);
49 abstr_args[i] = abstr;
53 map(lam->var(), abstr_var);
54 lattice_[lam->var()] = abstr_var;
57 for (
auto d : lam->deps())
63 return Rewriter::rewrite_imm_App(app);
68 if (
auto l = lattice(old_lam->var()); l && l != old_lam->var()) {
71 size_t num_old = old_lam->num_tvars();
73 if (
auto i = lam2lam_.find(old_lam); i != lam2lam_.end())
78 for (
size_t i = 0; i != num_old; ++i) {
79 auto old_var = old_lam->var(num_old, i);
80 auto abstr = lattice(old_var);
81 if (abstr == old_var) new_doms.emplace_back(
rewrite(old_lam->dom(num_old, i)));
85 size_t num_new = new_doms.size();
86 auto new_vars = absl::FixedArray<const Def*>(num_old);
88 lam2lam_[old_lam] = new_lam;
91 for (
size_t i = 0, j = 0; i != num_old; ++i) {
92 auto old_var = old_lam->var(num_old, i);
93 auto abstr = lattice(old_var);
94 new_vars[i] = abstr == old_var ? new_lam->
var(num_new, j++) :
rewrite(abstr);
97 map(old_lam->var(), new_vars);
102 size_t num_new = new_lam->
num_vars();
103 auto new_args = absl::FixedArray<const Def*>(num_new);
104 for (
size_t i = 0, j = 0; i != num_old; ++i) {
105 auto old_var = old_lam->var(num_old, i);
106 auto abstr = lattice(old_var);
107 if (abstr == old_var) new_args[j++] =
rewrite(old_app->targ(i));
110 return map(old_app,
new_world().app(new_lam, new_args));
114 return Rewriter::rewrite_imm_App(old_app);
const Def * callee() const
T * isa_mut() const
If this is mutable, it will cast constness away and perform a dynamic_cast to T.
const Def * var(nat_t a, nat_t i) noexcept
nat_t num_vars() noexcept
Lam * set(Filter filter, const Def *body)
bool todo_
Set to true to indicate that you want to rerun all Phasees in your current fixed-point PhaseMan.
World & new_world()
Create new Defs into this.
World & world()=delete
Hides both and forbids direct access.
virtual const Def * map(const Def *old_def, const Def *new_def)
virtual const Def * rewrite(const Def *)
virtual const Def * lookup(const Def *old_def)
Lookup old_def by searching in reverse through the stack of maps.
const Def * rewrite_imm_App(const App *) final
const Def * app(const Def *callee, const Def *arg)
const Def * tuple(Defs ops)
Lam * mut_lam(const Pi *pi)
Vector< const Def * > DefVec
Lam * isa_optimizable(Lam *lam)
These are Lams that are.