diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-03-16 11:53:50 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-03-16 11:53:50 +0800 |
commit | 19c2c6a9d2f27cf9da02fa766439274d1a4b4f5a (patch) | |
tree | c0f1301513de458a679849b86244ef751d66d7b0 /src/mir/optimise.cpp | |
parent | a3c1bd5942fc5a0e8dc8196bb7ae068429719d31 (diff) | |
download | mrust-19c2c6a9d2f27cf9da02fa766439274d1a4b4f5a.tar.gz |
MIR Optimise - Fix mis-optimise with assignment propagation
Diffstat (limited to 'src/mir/optimise.cpp')
-rw-r--r-- | src/mir/optimise.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/mir/optimise.cpp b/src/mir/optimise.cpp index 173b5d7e..2e823821 100644 --- a/src/mir/optimise.cpp +++ b/src/mir/optimise.cpp @@ -272,7 +272,7 @@ namespace { ), (UfcsKnown, TRACE_FUNCTION_F(path); - + // Obtain trait pointer (for default impl and to know what the item type is) const auto& trait_ref = state.m_resolve.m_crate.get_trait_by_path(state.sp, pe.trait.m_path); auto trait_vi_it = trait_ref.m_values.find(pe.item); @@ -319,7 +319,7 @@ namespace { } return false; }); - + if( bound_found ) { return nullptr; } @@ -333,6 +333,7 @@ namespace { params.self_ty = &*pe.type; params.fcn_params = &pe.params; + // Search for the method in the impl auto fit = impl.m_methods.find(pe.item); if( fit != impl.m_methods.end() ) { @@ -2146,6 +2147,12 @@ bool MIR_Optimise_PropagateSingleAssignments(::MIR::TypeResolve& state, ::MIR::F srcp = &*srcp->as_Field().val; if( !( srcp->is_Temporary() || srcp->is_Variable() || srcp->is_Argument() ) ) continue ; + + if( replacements.find(*srcp) != replacements.end() ) + { + DEBUG("> Can't replace, source has pending replacement"); + continue; + } } // TODO: Allow any rvalue, but that currently breaks due to chaining //else if( e.src.is_Borrow() ) @@ -2172,6 +2179,7 @@ bool MIR_Optimise_PropagateSingleAssignments(::MIR::TypeResolve& state, ::MIR::F for(unsigned int si2 = stmt_idx+1; si2 < block.statements.size(); si2 ++) { const auto& stmt2 = block.statements[si2]; + DEBUG("[find usage] " << stmt2); // Usage found. if( visit_mir_lvalues(stmt2, is_lvalue_usage) ) @@ -2195,7 +2203,7 @@ bool MIR_Optimise_PropagateSingleAssignments(::MIR::TypeResolve& state, ::MIR::F // Determine if source is mutated. // > Assume that any mutating access of the root value counts (over-cautious) - if( visit_mir_lvalues(block.statements[si2], [&](const auto& lv, auto vu){ return /*vu == ValUsage::Write &&*/ is_lvalue_in_val(lv); }) ) + if( visit_mir_lvalues(stmt2, [&](const auto& lv, auto vu){ return /*vu == ValUsage::Write &&*/ is_lvalue_in_val(lv); }) ) { stop = true; break; @@ -2203,7 +2211,7 @@ bool MIR_Optimise_PropagateSingleAssignments(::MIR::TypeResolve& state, ::MIR::F } if( !stop ) { - DEBUG(block.terminator); + DEBUG("[find usage] " << block.terminator); TU_MATCHA( (block.terminator), (e), (Incomplete, ), |