diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-03-10 22:46:59 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-03-10 22:46:59 +0800 |
commit | 13e2409860c35c8693675d7c2c9b202741f7ddde (patch) | |
tree | d77de837c5628950c4af64d525d813a98ce0f651 /src/mir/optimise.cpp | |
parent | 33ec90c927fef40bdfc86554285ddaf5ff772d15 (diff) | |
download | mrust-13e2409860c35c8693675d7c2c9b202741f7ddde.tar.gz |
MIR Optimise - basic size_of replacemnt
Diffstat (limited to 'src/mir/optimise.cpp')
-rw-r--r-- | src/mir/optimise.cpp | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/src/mir/optimise.cpp b/src/mir/optimise.cpp index 5062fcf7..173b5d7e 100644 --- a/src/mir/optimise.cpp +++ b/src/mir/optimise.cpp @@ -15,6 +15,7 @@ #include <mir/visit_crate_mir.hpp> #include <algorithm> #include <iomanip> +#include <trans/target.hpp> namespace { ::MIR::BasicBlockId get_new_target(const ::MIR::TypeResolve& state, ::MIR::BasicBlockId bb) @@ -1738,23 +1739,25 @@ bool MIR_Optimise_ConstPropagte(::MIR::TypeResolve& state, ::MIR::Function& fcn) const auto& tef = te.fcn.as_Intrinsic(); if( tef.name == "size_of" ) { - //size_t size_val = 0; - //if( Target_GetSizeOf(tef.params.m_types.at(0), size_val) ) - //{ - // bb.statements.push_back(::MIR::Statement::make_Assign({ mv$(te.ret_val), ::MIR::Constant::make_Uint(size_val) })); - // bb.terminator = ::MIR::Terminator::make_Goto(te.ret_block); - // changed = true; - //} + size_t size_val = 0; + if( Target_GetSizeOf(state.sp, tef.params.m_types.at(0), size_val) ) + { + auto val = ::MIR::Constant::make_Uint({ size_val, ::HIR::CoreType::Usize }); + bb.statements.push_back(::MIR::Statement::make_Assign({ mv$(te.ret_val), mv$(val) })); + bb.terminator = ::MIR::Terminator::make_Goto(te.ret_block); + changed = true; + } } else if( tef.name == "align_of" ) { - //size_t size_val = 0; - //if( Target_GetAlignOf(tef.params.m_types.at(0), size_val) ) - //{ - // bb.statements.push_back(::MIR::Statement::make_Assign({ mv$(te.ret_val), ::MIR::Constant::make_Uint(size_val) })); - // bb.terminator = ::MIR::Terminator::make_Goto(te.ret_block); - // changed = true; - //} + size_t align_val = 0; + if( Target_GetAlignOf(state.sp, tef.params.m_types.at(0), align_val) ) + { + auto val = ::MIR::Constant::make_Uint({ align_val, ::HIR::CoreType::Usize }); + bb.statements.push_back(::MIR::Statement::make_Assign({ mv$(te.ret_val), mv$(val) })); + bb.terminator = ::MIR::Terminator::make_Goto(te.ret_block); + changed = true; + } } // NOTE: Quick special-case for bswap<u8> (a no-op) else if( tef.name == "bswap" && tef.params.m_types.at(0) == ::HIR::CoreType::U8 ) |