bool AliasClass::subclassData(AliasClass o) const { switch (m_stag) { case STag::None: case STag::Frame: case STag::Prop: case STag::ElemI: case STag::ElemS: case STag::MIState: return equivData(o); case STag::Stack: if (m_stack.base != o.m_stack.base) return false; return m_stack.offset <= o.m_stack.offset && lowest_offset(m_stack) >= lowest_offset(o.m_stack); } not_reached(); }
bool AliasClass::subclassData(AliasClass o) const { assertx(m_stag == o.m_stag); switch (m_stag) { case STag::None: case STag::Frame: case STag::Prop: case STag::ElemI: case STag::ElemS: case STag::MIState: case STag::Ref: return equivData(o); case STag::Stack: return m_stack.offset <= o.m_stack.offset && lowest_offset(m_stack) >= lowest_offset(o.m_stack); } not_reached(); }
bool AliasClass::operator==(AliasClass o) const { return m_bits == o.m_bits && m_stag == o.m_stag && equivData(o); }
bool ALocation::operator<=(ALocation o) const { auto const isect = static_cast<rep>(m_bits & o.m_bits); if (isect != m_bits) return false; if (m_stag != o.m_stag) return m_bits == BEmpty; return equivData(o); }
bool ALocation::operator==(ALocation o) const { return m_bits == o.m_bits && m_stag == o.m_stag && equivData(o); }