10class Ext :
public Def {
44class Join :
public Def,
public Setters<Join> {
53 static constexpr size_t Num_Ops = std::dynamic_extent;
60class Inj :
public Def,
public Setters<Inj> {
70 const Def*
value()
const {
return op(0); }
86class Variant :
public Def,
public Setters<Variant> {
90 Variant(
const Def*
type,
size_t size)
98 Variant*
set(
size_t i,
const Def* def) {
return Def::set(i, def)->as<Variant>(); }
110 auto variant = d->isa_imm<Variant>();
111 return variant && variant->num_ops() == 1 ? variant->op(0) :
nullptr;
115 static constexpr size_t Num_Ops = std::dynamic_extent;
123class Match :
public Def,
public Setters<Match> {
131 static constexpr size_t Num_Ops = std::dynamic_extent;
136 template<
size_t N = std::dynamic_extent>
137 constexpr auto arms() const noexcept {
138 return ops().subspan<1, N>();
140 const Def*
arm(
size_t i)
const {
return arms()[i]; }
constexpr Node node() const noexcept
Def * set(size_t i, const Def *)
Successively set from left to right.
constexpr auto ops() const noexcept
constexpr flags_t flags() const noexcept
const Def * op(size_t i) const noexcept
const Def * type() const noexcept
Yields the "raw" type of this Def (maybe nullptr).
Def * unset()
Unsets all Def::ops; works even, if not set at all or only partially set.
Ext(Node node, const Def *type)
static constexpr bool isa_node(mim::Node n) noexcept
Ext groups Top and Bot; see fe::NodeSetable.
static constexpr auto Node
const Def * value() const
size_t index() const
The case of a Variant this injects into.
static constexpr size_t Num_Ops
static constexpr auto Node
static constexpr size_t Num_Ops
static bool accepts(const Def *arm, const Def *c, bool infer=false)
Does arm handle c?
static DefVec cases(const Def *scrutinee)
const Def * scrutinee() const
static constexpr size_t Num_Ops
static constexpr auto Node
const Def * arm(size_t i) const
constexpr auto arms() const noexcept
CRTP-based mixin to declare setters for Def::loc & Def::name using a covariant return type.
const TExt< Up > * set(Args &&... args) const
Extremum. Either Top (Up) or Bottom.
static constexpr auto Node
static constexpr size_t Num_Ops
Variant * set(size_t i, const Def *def)
static constexpr auto Node
static const Def * infer(World &, Defs)
static constexpr size_t Num_Ops
static const Def * isa_lone(const Def *d)
The payload A of a single-case Variant | A, which is isomorphic to A.
The World represents the whole program and manages creation of MimIR nodes (Defs).
fe::View< const Def * > Defs
fe::Vector< const Def * > DefVec