From: Egor Bogatov Date: Fri, 7 Aug 2020 13:07:56 +0000 (+0300) Subject: [mono][interp] Optimize box+unbox to no-op (#40017) X-Git-Tag: submit/tizen/20210909.063632~6161 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a0d41ec11310fe43fa2e81040e3e6a1702f18c6c;p=platform%2Fupstream%2Fdotnet%2Fruntime.git [mono][interp] Optimize box+unbox to no-op (#40017) --- diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index 1fd13dd..b81d5f9 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -4941,6 +4941,20 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, klass = mini_get_class (method, token, generic_context); CHECK_TYPELOAD (klass); + // Common in generic code: + // box T + unbox.any T -> nop + if ((td->last_ins->opcode == MINT_BOX || td->last_ins->opcode == MINT_BOX_VT) && + (td->sp - 1)->klass == klass && !td->is_bb_start[in_offset]) { + gboolean is_vt = td->last_ins->opcode == MINT_BOX_VT; + interp_clear_ins(td, td->last_ins); + if (is_vt) + PUSH_VT(td, mono_class_value_size(klass, NULL)); + int mt = mint_type(m_class_get_byval_arg(klass)); + SET_TYPE(td->sp - 1, stack_type[mt], klass); + td->ip += 5; + break; + } + if (mini_type_is_reference (m_class_get_byval_arg (klass))) { int mt = mint_type (m_class_get_byval_arg (klass)); interp_handle_isinst (td, klass, FALSE);