Optimizer - Removed unnecessary computations
The following computations will not be done if their results are cached: * instruction numbering, * control flow graph construction, * use-define chains
This commit is contained in:
parent
c89a62edae
commit
027d6a2f8d
2 changed files with 37 additions and 4 deletions
28
c-opopt.cc
28
c-opopt.cc
|
@ -58,11 +58,11 @@ constexpr uint32_t T_OptData::CFG_END;
|
||||||
void T_OptData::findInputDecls(
|
void T_OptData::findInputDecls(
|
||||||
T_OpsParserOutput& program ) noexcept
|
T_OpsParserOutput& program ) noexcept
|
||||||
{
|
{
|
||||||
if ( inputDecls ) {
|
if ( state & E_StateItem::INPUTS ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
inputDecls = T_KeyValueTable< T_String , T_Array< T_InputDecl > >{ };
|
inputDecls.clear( );
|
||||||
visitor.visit( program.root , [this]( A_Node& node , const bool exit ) {
|
visitor.visit( program.root , [this]( A_Node& node , const bool exit ) {
|
||||||
if ( exit && node.type( ) == A_Node::OP_INPUT ) {
|
if ( exit && node.type( ) == A_Node::OP_INPUT ) {
|
||||||
auto& input{ (T_InputInstrNode&) node };
|
auto& input{ (T_InputInstrNode&) node };
|
||||||
|
@ -75,6 +75,8 @@ void T_OptData::findInputDecls(
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
state = state | E_StateItem::INPUTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -110,6 +112,10 @@ bool ODNIVisitor_(
|
||||||
void T_OptData::numberInstructions(
|
void T_OptData::numberInstructions(
|
||||||
T_OpsParserOutput& program ) noexcept
|
T_OpsParserOutput& program ) noexcept
|
||||||
{
|
{
|
||||||
|
if ( state & E_StateItem::NUMBERING ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
instructions.clear( );
|
instructions.clear( );
|
||||||
instrIndex.clear( );
|
instrIndex.clear( );
|
||||||
|
|
||||||
|
@ -120,6 +126,8 @@ void T_OptData::numberInstructions(
|
||||||
return ODNIVisitor_( node , exit , *this , i );
|
return ODNIVisitor_( node , exit , *this , i );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state = state | E_StateItem::NUMBERING;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t T_OptData::indexOf(
|
uint32_t T_OptData::indexOf(
|
||||||
|
@ -485,6 +493,11 @@ inline T_StringBuilder BCFGDumpAll_(
|
||||||
void T_OptData::buildControlFlowGraph(
|
void T_OptData::buildControlFlowGraph(
|
||||||
T_OpsParserOutput& program ) noexcept
|
T_OpsParserOutput& program ) noexcept
|
||||||
{
|
{
|
||||||
|
if ( state & E_StateItem::CFG ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
numberInstructions( program );
|
||||||
|
|
||||||
// Keep the old array, we'll reuse its contents
|
// Keep the old array, we'll reuse its contents
|
||||||
T_Array< P_CtrlFlowNode > old{ std::move( ctrlFlowGraph ) };
|
T_Array< P_CtrlFlowNode > old{ std::move( ctrlFlowGraph ) };
|
||||||
M_LOGSTR_( "Building control flow graph" , 4 );
|
M_LOGSTR_( "Building control flow graph" , 4 );
|
||||||
|
@ -511,6 +524,8 @@ void T_OptData::buildControlFlowGraph(
|
||||||
logger( [this](){
|
logger( [this](){
|
||||||
return BCFGDumpAll_( *this );
|
return BCFGDumpAll_( *this );
|
||||||
} , 6 );
|
} , 6 );
|
||||||
|
|
||||||
|
state = state | E_StateItem::CFG;
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef M_ADDNEW_
|
#undef M_ADDNEW_
|
||||||
|
@ -1012,6 +1027,11 @@ void BUDCWalkGraph_(
|
||||||
void T_OptData::buildUseDefineChains(
|
void T_OptData::buildUseDefineChains(
|
||||||
T_OpsParserOutput& program ) noexcept
|
T_OpsParserOutput& program ) noexcept
|
||||||
{
|
{
|
||||||
|
if ( state & E_StateItem::UDCHAINS ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
buildControlFlowGraph( program );
|
||||||
|
|
||||||
M_LOGSTR_( "Building use/define chains" , 4 );
|
M_LOGSTR_( "Building use/define chains" , 4 );
|
||||||
varUDChains.clear( );
|
varUDChains.clear( );
|
||||||
|
|
||||||
|
@ -1060,6 +1080,8 @@ void T_OptData::buildUseDefineChains(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state = state | E_StateItem::UDCHAINS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1479,8 +1501,6 @@ bool opopt::PropagateConstants(
|
||||||
// updated at the end of the frame function, the value cannot be
|
// updated at the end of the frame function, the value cannot be
|
||||||
// propagated.
|
// propagated.
|
||||||
|
|
||||||
oData.numberInstructions( program );
|
|
||||||
oData.buildControlFlowGraph( program );
|
|
||||||
oData.buildUseDefineChains( program );
|
oData.buildUseDefineChains( program );
|
||||||
M_LOGSTR_( "... Propagating constants" , 2 );
|
M_LOGSTR_( "... Propagating constants" , 2 );
|
||||||
|
|
||||||
|
|
13
c-opopt.hh
13
c-opopt.hh
|
@ -29,6 +29,19 @@ struct T_OptData
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Elements of the optimizer's state
|
||||||
|
enum class E_StateItem
|
||||||
|
{
|
||||||
|
INPUTS ,
|
||||||
|
NUMBERING ,
|
||||||
|
CFG ,
|
||||||
|
UDCHAINS
|
||||||
|
};
|
||||||
|
using T_State = T_Flags< E_StateItem >;
|
||||||
|
T_State state{};
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
// Table of input declarations; used to fold constant inputs.
|
// Table of input declarations; used to fold constant inputs.
|
||||||
struct T_InputDecl {
|
struct T_InputDecl {
|
||||||
ebcl::T_SRDLocation location;
|
ebcl::T_SRDLocation location;
|
||||||
|
|
Loading…
Reference in a new issue