Goose  Artifact [f74e034ea6]

Artifact f74e034ea6375da96fbb0f0b12857c459997e221e6f519221bcd73c4e2127fb5:

  • File bs/cir/instruction.cpp — part of check-in [0db147f117] at 2024-09-15 20:24:31 on branch cir-ssa-refactor — Add clang format settings, reformat everything (user: achavasse size: 3005)

#include "cir/cir.h"

namespace goose::cir
{
    bool CanBeExecuted( const Instruction& instr )
    {
        return visit(
            []< typename ET >( const ET& e )
            {
                if constexpr( is_same_v< ET, monostate > )
                    return false;
                else
                    return e.canBeExecuted();
            },
            instr );
    }

    bool CanBeEagerlyEvaluated( const Instruction& instr )
    {
        return visit(
            []< typename ET >( const ET& e )
            {
                if constexpr( is_same_v< ET, monostate > )
                    return false;
                else
                    return e.canBeEagerlyEvaluated();
            },
            instr );
    }

    bool HaveSideEffects( const Instruction& instr )
    {
        return visit(
            []< typename ET >( const ET& e )
            {
                if constexpr( is_same_v< ET, monostate > )
                    return false;
                else
                    return e.haveSideEffects();
            },
            instr );
    }

    ostream& operator<<( ostream& out, const Instruction& instr )
    {
        return visit(
            [&]< typename ET >( const ET& e ) -> ostream&
            {
                if constexpr( is_same_v< ET, monostate > )
                    return out << "NIL";
                else
                    return out << e;
            },
            instr );
    }

    ostream& operator<<( ostream& out, const Select& ins )
    {
        out << "SELECT(" << ins.m_memberIndex;
        return out << ')';
    }

    ostream& operator<<( ostream& out, const Load& ins )
    {
        out << "LOAD(";
        return out << ins.m_type.get() << ')';
    }

    ostream& operator<<( ostream& out, const Store& ins )
    {
        return out << "STORE";
    }

    ostream& operator<<( ostream& out, const PHOverrideSet& ins )
    {
        return out << "PHOVERRIDESET(" << ins.m_name << ')';
    }

    ostream& operator<<( ostream& out, const PHOverrideClear& ins )
    {
        return out << "PHOVERRIDECLEAR(" << ins.m_name << ')';
    }

    ostream& operator<<( ostream& out, const Phi& ins )
    {
        out << "PHI(" << ins.m_destIndex << ", " << ins.m_type.get();

        for( const auto& [bb, val] : ins.m_incomings )
            out << ", " << bb.lock()->index() << ':' << val;

        return out << " )";
    }

    bool Select::operator<( const Select& rhs ) const
    {
        return m_memberIndex < rhs.m_memberIndex;
    }

    bool Load::operator<( const Load& rhs ) const
    {
        return m_type < rhs.m_type.get();
    }

    bool Store::operator<( const Store& rhs ) const
    {
        return m_type < rhs.m_type.get();
    }

    bool PHOverrideSet::operator<( const PHOverrideSet& rhs ) const
    {
        return m_name < rhs.m_name;
    }

    bool PHOverrideClear::operator<( const PHOverrideClear& rhs ) const
    {
        return m_name < rhs.m_name;
    }
} // namespace goose::cir