8 auto [ptr, index] = arg->
projs<2>();
9 auto [pointee, addr_space] =
force<Ptr>(ptr->type())->args<2>();
11 if (
auto a =
Lit::isa(pointee->arity()); a && *a == 1)
return ptr;
18 auto& world = type->
world();
20 auto [pointee, addr_space] =
force<Ptr>(ptr->type())->args<2>();
22 if (ptr->isa<
Bot>())
return world.tuple({
mem, world.bot(type->as<
Sigma>()->
op(1))});
25 if (
auto sigma = pointee->isa<
Sigma>(); sigma && sigma->
num_ops() == 0)
26 return world.tuple({
mem, world.tuple(sigma->type(), {})});
34 auto [
mem, ptr, val] = arg->
projs<3>();
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;
World & world() const noexcept
const Def * op(size_t i) const noexcept
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
constexpr size_t num_ops() const noexcept
static std::optional< T > isa(const Def *def)
A (possibly paramterized) Tuple.
Data constructor for a Sigma.
#define MIM_mem_NORMALIZER_IMPL
const Def * normalize_lea(const Def *, const Def *, const Def *arg)
const Def * normalize_remem(const Def *, const Def *, const Def *)
const Def * normalize_store(const Def *, const Def *, const Def *arg)
const Def * normalize_load(const Def *type, const Def *, const Def *arg)
auto force(const Def *def)