Optimizer - Fixed control flow graph building
This commit is contained in:
parent
61cd7719f1
commit
f58226aa79
1 changed files with 53 additions and 8 deletions
61
c-opopt.cc
61
c-opopt.cc
|
@ -247,7 +247,7 @@ void T_OptData::buildControlFlowGraph(
|
|||
auto& cb{ *M_NODE_( cbi ) };
|
||||
cb.inbound.add( se.condBlock );
|
||||
M_NODE_( se.condBlock )->outbound.add( cbi );
|
||||
cb.outbound.add( cNode );
|
||||
cb.outbound.add( *cNode );
|
||||
M_NODE_( *cNode )->inbound.add( cbi );
|
||||
}
|
||||
if ( !se.hasDefault ) {
|
||||
|
@ -296,7 +296,7 @@ void T_OptData::buildControlFlowGraph(
|
|||
|
||||
auto& cs{ callSites.addNew( ) };
|
||||
cs.name = ci.id( );
|
||||
cs.callBlock = cNode;
|
||||
cs.callBlock = *cNode;
|
||||
cNode = cs.retBlock = M_ADDNEW_( );
|
||||
return true;
|
||||
}
|
||||
|
@ -318,7 +318,7 @@ void T_OptData::buildControlFlowGraph(
|
|||
stack.last( ).hasDefault = stack.last( ).hasDefault
|
||||
|| ( nt == A_Node::TN_DEFAULT );
|
||||
cNode = M_ADDNEW_( );
|
||||
stack.last( ).caseBlocks.add( cNode );
|
||||
stack.last( ).caseBlocks.add( *cNode );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -353,9 +353,52 @@ void T_OptData::buildControlFlowGraph(
|
|||
const auto n{ frec->first + frec->count - 1 };
|
||||
auto& exit{ ctrlFlowGraph[ n ] };
|
||||
exit->outbound.add( cs.retBlock );
|
||||
M_NODE_( cs.retBlock )->outbound.add( n );
|
||||
M_NODE_( cs.retBlock )->inbound.add( n );
|
||||
}
|
||||
}
|
||||
|
||||
// Dump whole graph
|
||||
logger( [&](){
|
||||
T_StringBuilder dump;
|
||||
|
||||
int i{ 0 };
|
||||
dump << "Control flow graph dump\n";
|
||||
for ( auto const& p : ctrlFlowGraph ) {
|
||||
auto const& e{ *p };
|
||||
dump << "\nNode " << i++ << "\n\t";
|
||||
if ( e.instructions ) {
|
||||
dump << e.instructions->count
|
||||
<< " instruction(s) at index "
|
||||
<< e.instructions->first;
|
||||
} else {
|
||||
dump << "No instructions";
|
||||
}
|
||||
dump << "\n\tInbound:";
|
||||
{
|
||||
const auto ni{ e.inbound.size( ) };
|
||||
if ( ni == 0 ) {
|
||||
dump << " NONE";
|
||||
}
|
||||
for ( auto idx = 0u ; idx < ni ; idx ++ ) {
|
||||
dump << ' ' << e.inbound[ idx ];
|
||||
}
|
||||
}
|
||||
dump << "\n\tOutbound:";
|
||||
{
|
||||
const auto no{ e.outbound.size( ) };
|
||||
if ( no == 0 ) {
|
||||
dump << " NONE";
|
||||
}
|
||||
for ( auto idx = 0u ; idx < no ; idx ++ ) {
|
||||
dump << ' ' << e.outbound[ idx ];
|
||||
}
|
||||
}
|
||||
dump << '\n';
|
||||
}
|
||||
dump << '\n';
|
||||
|
||||
return dump;
|
||||
} , LL2 );
|
||||
}
|
||||
|
||||
#undef M_ADDNEW_
|
||||
|
@ -451,11 +494,13 @@ void BUDCVisitor_(
|
|||
|
||||
default: break;
|
||||
|
||||
case A_Node::EXPR_ID:
|
||||
BUDCAddRecord_( n ,
|
||||
dynamic_cast< T_IdentifierExprNode& >( n ).id( ) ,
|
||||
true , od , root );
|
||||
case A_Node::EXPR_ID: {
|
||||
auto const& id{ dynamic_cast< T_IdentifierExprNode& >( n ).id( ) };
|
||||
if ( id != "width" && id != "height" && id != "time" ) {
|
||||
BUDCAddRecord_( n , id , true , od , root );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case A_Node::OP_UNIFORMS:
|
||||
BUDCAddRecord_( n ,
|
||||
|
|
Loading…
Reference in a new issue