diff options
author | John Hodge <tpg@mutabah.net> | 2017-02-01 20:35:23 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2017-02-01 20:35:23 +0800 |
commit | 15790ac4aa2d99ebdc105bf3f7053d498f7541a5 (patch) | |
tree | 610efe0b0fde4fbc18872a654b1f0c2729b17fc3 /src | |
parent | 137ef62d7107437aa8d1fb860bf63a58dce634b8 (diff) | |
download | mrust-15790ac4aa2d99ebdc105bf3f7053d498f7541a5.tar.gz |
MIR Optimise - Fix edge case incorrect optimisation
Diffstat (limited to 'src')
-rw-r--r-- | src/mir/helpers.hpp | 5 | ||||
-rw-r--r-- | src/mir/optimise.cpp | 7 |
2 files changed, 9 insertions, 3 deletions
diff --git a/src/mir/helpers.hpp b/src/mir/helpers.hpp index cc0766ec..ab558791 100644 --- a/src/mir/helpers.hpp +++ b/src/mir/helpers.hpp @@ -95,6 +95,11 @@ public: const ::HIR::TypeRef& get_lvalue_type(::HIR::TypeRef& tmp, const ::MIR::LValue& val) const; const ::HIR::TypeRef* is_type_owned_box(const ::HIR::TypeRef& ty) const; + + friend ::std::ostream& operator<<(::std::ostream& os, const TypeResolve& x) { + x.fmt_pos(os); + return os; + } }; } // namespace MIR diff --git a/src/mir/optimise.cpp b/src/mir/optimise.cpp index 2a3f2f70..e24aa22d 100644 --- a/src/mir/optimise.cpp +++ b/src/mir/optimise.cpp @@ -406,7 +406,7 @@ void MIR_Optimise(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path #if 0 if( change_happened ) { - MIR_Dump_Fcn(::std::cout, fcn); + //MIR_Dump_Fcn(::std::cout, fcn); MIR_Validate(resolve, path, fcn, args, ret_type); } #endif @@ -1791,6 +1791,7 @@ bool MIR_Optimise_PropagateSingleAssignments(::MIR::TypeResolve& state, ::MIR::F { for(auto it = block.statements.begin(); it != block.statements.end(); ++it) { + state.set_cur_stmt(&block - &fcn.blocks.front(), it - block.statements.begin()); if( !it->is_Assign() ) continue; if( it->as_Assign().src.tag() == ::MIR::RValue::TAGDEAD ) @@ -1828,7 +1829,7 @@ bool MIR_Optimise_PropagateSingleAssignments(::MIR::TypeResolve& state, ::MIR::F auto is_lvalue_in_val = [&](const auto& lv) { return visit_mir_lvalue(new_dst_lval, ValUsage::Write, [&](const auto& slv, auto ) { return lv == slv; }); }; - if( visit_mir_lvalues(*it3, [&](const auto& lv, auto vu){ return vu == ValUsage::Write && is_lvalue_in_val(lv); }) ) + if( visit_mir_lvalues(*it3, [&](const auto& lv, auto ){ return is_lvalue_in_val(lv); }) ) { was_invalidated = true; break; @@ -1838,7 +1839,7 @@ bool MIR_Optimise_PropagateSingleAssignments(::MIR::TypeResolve& state, ::MIR::F // Replacement is valid. if( ! was_invalidated ) { - DEBUG("Replace assignment of " << to_replace_lval << " with " << new_dst_lval); + DEBUG(state << "Replace assignment of " << to_replace_lval << " with " << new_dst_lval); it->as_Assign().dst = mv$(it2->as_Assign().dst); block.statements.erase(it2); replacement_happend = true; |