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:
Emmanuel BENOîT 2017-12-15 07:16:51 +01:00
parent c89a62edae
commit 027d6a2f8d
2 changed files with 37 additions and 4 deletions

View file

@ -58,11 +58,11 @@ constexpr uint32_t T_OptData::CFG_END;
void T_OptData::findInputDecls(
T_OpsParserOutput& program ) noexcept
{
if ( inputDecls ) {
if ( state & E_StateItem::INPUTS ) {
return;
}
inputDecls = T_KeyValueTable< T_String , T_Array< T_InputDecl > >{ };
inputDecls.clear( );
visitor.visit( program.root , [this]( A_Node& node , const bool exit ) {
if ( exit && node.type( ) == A_Node::OP_INPUT ) {
auto& input{ (T_InputInstrNode&) node };
@ -75,6 +75,8 @@ void T_OptData::findInputDecls(
}
return true;
} );
state = state | E_StateItem::INPUTS;
}
@ -110,6 +112,10 @@ bool ODNIVisitor_(
void T_OptData::numberInstructions(
T_OpsParserOutput& program ) noexcept
{
if ( state & E_StateItem::NUMBERING ) {
return;
}
instructions.clear( );
instrIndex.clear( );
@ -120,6 +126,8 @@ void T_OptData::numberInstructions(
return ODNIVisitor_( node , exit , *this , i );
} );
}
state = state | E_StateItem::NUMBERING;
}
uint32_t T_OptData::indexOf(
@ -485,6 +493,11 @@ inline T_StringBuilder BCFGDumpAll_(
void T_OptData::buildControlFlowGraph(
T_OpsParserOutput& program ) noexcept
{
if ( state & E_StateItem::CFG ) {
return;
}
numberInstructions( program );
// Keep the old array, we'll reuse its contents
T_Array< P_CtrlFlowNode > old{ std::move( ctrlFlowGraph ) };
M_LOGSTR_( "Building control flow graph" , 4 );
@ -511,6 +524,8 @@ void T_OptData::buildControlFlowGraph(
logger( [this](){
return BCFGDumpAll_( *this );
} , 6 );
state = state | E_StateItem::CFG;
}
#undef M_ADDNEW_
@ -1012,6 +1027,11 @@ void BUDCWalkGraph_(
void T_OptData::buildUseDefineChains(
T_OpsParserOutput& program ) noexcept
{
if ( state & E_StateItem::UDCHAINS ) {
return;
}
buildControlFlowGraph( program );
M_LOGSTR_( "Building use/define chains" , 4 );
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
// propagated.
oData.numberInstructions( program );
oData.buildControlFlowGraph( program );
oData.buildUseDefineChains( program );
M_LOGSTR_( "... Propagating constants" , 2 );

View file

@ -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.
struct T_InputDecl {
ebcl::T_SRDLocation location;