8 auto [ptr, index] = arg->
projs<2>();
17 auto& world = type->world();
21 if (ptr->isa<
Bot>())
return world.tuple({
mem, world.bot(type->as<
Sigma>()->
op(1))});
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;
39 if (std::ranges::all_of(
tuple->ops(), [](
const Def* op) { return op->isa<Bot>(); }))
return mem;
static auto as(const Def *def)
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)
const Def * pointee(const Def *ptr)