Skip to content

Commit ce6016e

Browse files
committed
[interp] Backport of dotnet/runtime#48513
1 parent 8237dff commit ce6016e

File tree

3 files changed

+13
-5
lines changed

3 files changed

+13
-5
lines changed

mono/mini/interp/interp.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -4119,7 +4119,7 @@ interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClauseArgs
41194119

41204120
#define BRELOP_CAST(datatype, op) \
41214121
if (LOCAL_VAR (ip [1], datatype) op LOCAL_VAR (ip [2], datatype)) { \
4122-
gint32 br_offset = (gint32) ip [1]; \
4122+
gint32 br_offset = (gint32)READ32(ip + 3); \
41234123
BACK_BRANCH_PROFILE (br_offset); \
41244124
ip += br_offset; \
41254125
} else \

mono/mini/interp/transform.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -2660,6 +2660,7 @@ interp_inline_method (TransformData *td, MonoMethod *target_method, MonoMethodHe
26602660
int prev_n_data_items;
26612661
int i;
26622662
int prev_sp_offset;
2663+
int prev_aggressive_inlining;
26632664
MonoGenericContext *generic_context = NULL;
26642665
StackInfo *prev_param_area;
26652666
InterpBasicBlock **prev_offset_to_bb;
@@ -2686,6 +2687,7 @@ interp_inline_method (TransformData *td, MonoMethod *target_method, MonoMethodHe
26862687
prev_offset_to_bb = td->offset_to_bb;
26872688
prev_cbb = td->cbb;
26882689
prev_entry_bb = td->entry_bb;
2690+
prev_aggressive_inlining = td->aggressive_inlining;
26892691
td->inlined_method = target_method;
26902692

26912693
prev_max_stack_height = td->max_stack_height;
@@ -2701,7 +2703,7 @@ interp_inline_method (TransformData *td, MonoMethod *target_method, MonoMethodHe
27012703

27022704
int const prev_code_size = td->code_size;
27032705
td->code_size = header->code_size;
2704-
2706+
td->aggressive_inlining = !!(target_method->iflags & METHOD_IMPL_ATTRIBUTE_AGGRESSIVE_INLINING);
27052707
if (td->verbose_level)
27062708
g_print ("Inline start method %s.%s\n", m_class_get_name (target_method->klass), target_method->name);
27072709

@@ -2746,6 +2748,7 @@ interp_inline_method (TransformData *td, MonoMethod *target_method, MonoMethodHe
27462748
td->offset_to_bb = prev_offset_to_bb;
27472749
td->code_size = prev_code_size;
27482750
td->entry_bb = prev_entry_bb;
2751+
td->aggressive_inlining = prev_aggressive_inlining;
27492752

27502753
g_free (td->in_offsets);
27512754
td->in_offsets = prev_in_offsets;
@@ -2983,7 +2986,7 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
29832986
}
29842987

29852988
/* Don't inline methods that do calls */
2986-
if (op == -1 && td->inlined_method)
2989+
if (op == -1 && td->inlined_method && !td->aggressive_inlining)
29872990
return FALSE;
29882991

29892992
/* We need to convert delegate invoke to a indirect call on the interp_invoke_impl field */
@@ -5471,7 +5474,8 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
54715474
// Inlining failed. Set the method to be executed as part of newobj instruction
54725475
newobj_fast->data [0] = get_data_item_index (td, mono_interp_get_imethod (domain, m, error));
54735476
/* The constructor was not inlined, abort inlining of current method */
5474-
INLINE_FAILURE;
5477+
if (!td->aggressive_inlining)
5478+
INLINE_FAILURE;
54755479
} else {
54765480
interp_add_ins (td, MINT_NEWOBJ);
54775481
g_assert (!m_class_is_valuetype (klass));
@@ -5607,7 +5611,8 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
56075611

56085612
break;
56095613
case CEE_THROW:
5610-
INLINE_FAILURE;
5614+
if (!td->aggressive_inlining)
5615+
INLINE_FAILURE;
56115616
CHECK_STACK (td, 1);
56125617
interp_add_ins (td, MINT_THROW);
56135618
interp_ins_set_sreg (td->last_ins, td->sp [-1].local);

mono/mini/interp/transform.h

+3
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ typedef struct
192192
GList *dont_inline;
193193
int inline_depth;
194194
int has_localloc : 1;
195+
// If the current method (inlined_method) has the aggressive inlining attribute, we no longer
196+
// bail out of inlining when having to generate certain opcodes (like call, throw).
197+
int aggressive_inlining : 1;
195198
} TransformData;
196199

197200
#define STACK_TYPE_I4 0

0 commit comments

Comments
 (0)