Optimizer - Working constant propagation

AST's replace function needed to be recursive
This commit is contained in:
Emmanuel BENOîT 2017-12-14 07:39:38 +01:00
parent 223dd1763d
commit 12f9402c94
4 changed files with 16 additions and 8 deletions

View file

@ -32,18 +32,24 @@ T_RootNode& A_Node::root( ) const noexcept
const_cast< A_Node* >( node ) );
}
void A_Node::replace(
bool A_Node::replace(
A_Node const& node ,
T_OwnPtr< A_Node > replacement
T_OwnPtr< A_Node >& replacement
) noexcept
{
const auto nc{ size( ) };
for ( auto i = 0u ; i < nc ; i ++ ) {
if ( child( i ).get( ) == &node ) {
child( i ) = std::move( replacement );
return;
return true;
}
}
for ( auto i = 0u ; i < nc ; i ++ ) {
if ( child( i ) && child( i )->replace( node , replacement ) ) {
return true;
}
}
return false;
}
/*----------------------------------------------------------------------------*/

View file

@ -107,8 +107,8 @@ class A_Node
const uint32_t index ) noexcept
{ return children_[ index ]; }
void replace( A_Node const& node ,
T_OwnPtr< A_Node > replacement ) noexcept;
bool replace( A_Node const& node ,
T_OwnPtr< A_Node >& replacement ) noexcept;
};
// Browser function to be used with T_Visitor

View file

@ -1461,9 +1461,11 @@ void CPReplaceWithConstant_(
}
auto& p{ eid.parent( ) };
auto replacement{ NewOwned< T_ConstantExprNode >( p , value ) };
T_OwnPtr< A_Node > replacement{
NewOwned< T_ConstantExprNode >( p , value )
};
replacement->location( ) = eid.location( );
p.replace( eid , std::move( replacement ) );
p.replace( eid , replacement );
oData.logger( [&]() {
T_StringBuilder sb;
sb << "Propagated constant from " << var.name

View file

@ -5,7 +5,7 @@
)
(optimizer on
(constant-folding on
# (fixed-resolution on)
(fixed-resolution on)
)
(constant-propagation on)
)