#include "cir/cir.h"
namespace goose::cir
{
bool Instruction::canBeExecuted() const
{
return visit( []< typename ET >( const ET& e )
{
if constexpr( is_same_v< ET, monostate > )
return false;
else if constexpr( is_same_v< ET, ptr< CFG > > )
return e->canBeExecuted();
else
return e.canBeExecuted();
}, m_content );
}
bool Instruction::canBeEagerlyEvaluated() const
{
return visit( []< typename ET >( const ET& e )
{
if constexpr( is_same_v< ET, monostate > )
return false;
else if constexpr( is_same_v< ET, ptr< CFG > > )
return e->canBeEagerlyEvaluated();
else
return e.canBeEagerlyEvaluated();
}, m_content );
}
bool Instruction::isCompTimeStackAddr() const
{
return visit( []< typename ET >( const ET& e )
{
if constexpr( is_same_v< ET, monostate > )
return false;
else if constexpr( is_same_v< ET, ptr< CFG > > )
return false;
else
return e.isCompTimeStackAddr();
}, m_content );
}
bool Select::isCompTimeStackAddr() const
{
return m_baseAddr && m_baseAddr->isCompTimeStackAddr();
}
bool Load::canBeEagerlyEvaluated() const
{
return m_addr && m_addr->isCompTimeStackAddr();
}
bool Store::canBeEagerlyEvaluated() const
{
return m_addr && m_addr->isCompTimeStackAddr()
&& CanValueBeEagerlyEvaluated( m_val );
}
}