Optimizer - Some refactoring
This commit is contained in:
parent
9151ceb2c9
commit
5ecc95766a
1 changed files with 85 additions and 80 deletions
165
c-opopt.cc
165
c-opopt.cc
|
@ -434,6 +434,89 @@ void BUDCAddRecord_(
|
|||
} , LL2 );
|
||||
}
|
||||
|
||||
void BUDCVisitor_(
|
||||
T_RootNode& root ,
|
||||
T_OptData& od ,
|
||||
A_Node& n )
|
||||
{
|
||||
switch ( n.type( ) ) {
|
||||
|
||||
default: break;
|
||||
|
||||
case A_Node::EXPR_ID:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_IdentifierExprNode& >( n ).id( ) ,
|
||||
true , od , root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_UNIFORMS:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_UniformsInstrNode& >( n ).progId( ) ,
|
||||
true , od , root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_USE_TEXTURE:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_UseTextureInstrNode& >( n ).samplerId( ) ,
|
||||
true , od , root );
|
||||
// fallthrough
|
||||
case A_Node::OP_USE_PROGRAM:
|
||||
case A_Node::OP_USE_PIPELINE:
|
||||
case A_Node::OP_USE_FRAMEBUFFER:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_UseInstrNode& >( n ).id( ) ,
|
||||
true , od , root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_PIPELINE: {
|
||||
auto& pln{ dynamic_cast< T_PipelineInstrNode& >( n ) };
|
||||
BUDCAddRecord_( n , pln.id( ) , false , od , root );
|
||||
const auto np{ pln.size( ) };
|
||||
for ( auto i = 0u ; i < np ; i ++ ) {
|
||||
BUDCAddRecord_( n , pln.program( i ) ,
|
||||
true , od , root );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case A_Node::TN_FBATT:
|
||||
BUDCAddRecord_( n , dynamic_cast< T_FramebufferInstrNode::T_Attachment& >( n ).id( ) ,
|
||||
true , od , root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_FRAMEBUFFER:
|
||||
case A_Node::OP_TEXTURE:
|
||||
case A_Node::OP_SAMPLER:
|
||||
case A_Node::OP_PROGRAM:
|
||||
BUDCAddRecord_( n , dynamic_cast< A_ResourceDefInstrNode& >( n ).id( ) ,
|
||||
false , od , root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_SET:
|
||||
BUDCAddRecord_( n , dynamic_cast< T_SetInstrNode& >( n ).id( ) ,
|
||||
false , od , root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_CALL: {
|
||||
auto& cn{ dynamic_cast< T_CallInstrNode& >( n ) };
|
||||
auto& callee{ root.function(
|
||||
root.functionIndex( cn.id( ) ) ) };
|
||||
const auto nlocs{ callee.locals( ) };
|
||||
for ( auto i = 0u ; i < nlocs ; i ++ ) {
|
||||
auto const& name{ callee.getLocalName( i ) };
|
||||
if ( !callee.isArgument( name ) ) {
|
||||
continue;
|
||||
}
|
||||
const T_OptData::T_VarId vid{ name , callee.name( ) , true };
|
||||
BUDCAddRecord_( n , name , false , od ,
|
||||
root , &vid );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace <anon>
|
||||
|
||||
|
@ -462,87 +545,9 @@ void T_OptData::buildUseDefineChains(
|
|||
* looking at the call sites.
|
||||
*/
|
||||
visitor.visit( program.root , [&]( auto& n , const bool exit ) {
|
||||
if ( exit ) {
|
||||
return true;
|
||||
if ( !exit ) {
|
||||
BUDCVisitor_( program.root , *this , n );
|
||||
}
|
||||
|
||||
switch ( n.type( ) ) {
|
||||
|
||||
default: break;
|
||||
|
||||
case A_Node::EXPR_ID:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_IdentifierExprNode& >( n ).id( ) ,
|
||||
true , *this , program.root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_UNIFORMS:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_UniformsInstrNode& >( n ).progId( ) ,
|
||||
true , *this , program.root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_USE_TEXTURE:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_UseTextureInstrNode& >( n ).samplerId( ) ,
|
||||
true , *this , program.root );
|
||||
// fallthrough
|
||||
case A_Node::OP_USE_PROGRAM:
|
||||
case A_Node::OP_USE_PIPELINE:
|
||||
case A_Node::OP_USE_FRAMEBUFFER:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_UseInstrNode& >( n ).id( ) ,
|
||||
true , *this , program.root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_PIPELINE: {
|
||||
auto& pln{ dynamic_cast< T_PipelineInstrNode& >( n ) };
|
||||
BUDCAddRecord_( n , pln.id( ) , false , *this , program.root );
|
||||
const auto np{ pln.size( ) };
|
||||
for ( auto i = 0u ; i < np ; i ++ ) {
|
||||
BUDCAddRecord_( n , pln.program( i ) ,
|
||||
true , *this , program.root );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case A_Node::TN_FBATT:
|
||||
BUDCAddRecord_( n , dynamic_cast< T_FramebufferInstrNode::T_Attachment& >( n ).id( ) ,
|
||||
true , *this , program.root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_FRAMEBUFFER:
|
||||
case A_Node::OP_TEXTURE:
|
||||
case A_Node::OP_SAMPLER:
|
||||
case A_Node::OP_PROGRAM:
|
||||
BUDCAddRecord_( n , dynamic_cast< A_ResourceDefInstrNode& >( n ).id( ) ,
|
||||
false , *this , program.root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_SET:
|
||||
BUDCAddRecord_( n , dynamic_cast< T_SetInstrNode& >( n ).id( ) ,
|
||||
false , *this , program.root );
|
||||
break;
|
||||
|
||||
case A_Node::OP_CALL: {
|
||||
auto& cn{ dynamic_cast< T_CallInstrNode& >( n ) };
|
||||
auto& callee{ program.root.function(
|
||||
program.root.functionIndex( cn.id( ) ) ) };
|
||||
const auto nlocs{ callee.locals( ) };
|
||||
for ( auto i = 0u ; i < nlocs ; i ++ ) {
|
||||
auto const& name{ callee.getLocalName( i ) };
|
||||
if ( !callee.isArgument( name ) ) {
|
||||
continue;
|
||||
}
|
||||
const T_VarId vid{ name , callee.name( ) , true };
|
||||
BUDCAddRecord_( n , name , false , *this ,
|
||||
program.root , &vid );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
} );
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue