diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-04-22 14:09:36 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-04-22 14:09:36 +0800 |
commit | 33d1a89fe5de0ef839789bc858aa79330f8dc425 (patch) | |
tree | 8a170fbfdfcc8b3f85a1a7328a51d097224b9c65 /src/mir/optimise.cpp | |
parent | 83b9e560df97f054dc2ea0660cda3fb55cd274d7 (diff) | |
download | mrust-33d1a89fe5de0ef839789bc858aa79330f8dc425.tar.gz |
MIR Optimise - Unify ScopeEnd statements
Diffstat (limited to 'src/mir/optimise.cpp')
-rw-r--r-- | src/mir/optimise.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/mir/optimise.cpp b/src/mir/optimise.cpp index 063e5fe3..f66b3240 100644 --- a/src/mir/optimise.cpp +++ b/src/mir/optimise.cpp @@ -471,6 +471,31 @@ bool MIR_Optimise_BlockSimplify(::MIR::TypeResolve& state, ::MIR::Function& fcn) // >> Replace targets that point to a block that is just a goto for(auto& block : fcn.blocks) { + // Unify sequential ScopeEnd statements + if( block.statements.size() > 1 ) + { + for(auto it = block.statements.begin() + 1; it != block.statements.end(); ) + { + if( (it-1)->is_ScopeEnd() && it->is_ScopeEnd() ) + { + auto& dst = (it-1)->as_ScopeEnd(); + const auto& src = it->as_ScopeEnd(); + DEBUG("Unify " << *(it-1) << " and " << *it); + for(auto v : src.vars) + dst.vars.push_back(v); + for(auto v : src.tmps) + dst.tmps.push_back(v); + ::std::sort(dst.vars.begin(), dst.vars.end()); + ::std::sort(dst.tmps.begin(), dst.tmps.end()); + it = block.statements.erase(it); + } + else + { + ++ it; + } + } + } + TU_MATCHA( (block.terminator), (e), (Incomplete, ), @@ -1343,7 +1368,7 @@ bool MIR_Optimise_ConstPropagte(::MIR::TypeResolve& state, ::MIR::Function& fcn) } } // NOTE: Quick special-case for bswap<u8/i8> (a no-op) - else if( tef.name == "bswap" && (tef.params.m_types.at(0) == ::HIR::CoreType::U8 || tef.params.m_types.at(0) == ::HIR::CoreType::I8 ) + else if( tef.name == "bswap" && (tef.params.m_types.at(0) == ::HIR::CoreType::U8 || tef.params.m_types.at(0) == ::HIR::CoreType::I8) ) { DEBUG("bswap<u8> is a no-op"); if( auto* e = te.args.at(0).opt_LValue() ) |