1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* compile.c (iseq_compile_each): share InlineCache during same

instance variable accesses. Reducing memory consumption,
	  rasing cache hit rate and rasing branch prediction hit rate
	  are expected. A part of [Bug #12274].

	* iseq.h (struct iseq_compile_data): introduce instance
	  variable IC table for sharing.

	* iseq.c (prepare_iseq_build, compile_data_free):
	  construct/destruct above table.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54976 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tarui 2016-05-11 12:50:38 +00:00
parent ac8c23f1b5
commit 44916ec448
4 changed files with 35 additions and 3 deletions

View file

@ -1,3 +1,16 @@
Wed May 11 21:30:07 2016 Masaya Tarui <tarui@ruby-lang.org>
* compile.c (iseq_compile_each): share InlineCache during same
instance variable accesses. Reducing memory consumption,
rasing cache hit rate and rasing branch prediction hit rate
are expected. A part of [Bug #12274].
* iseq.h (struct iseq_compile_data): introduce instance
variable IC table for sharing.
* iseq.c (prepare_iseq_build, compile_data_free):
construct/destruct above table.
Wed May 11 17:18:53 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* util.c (ruby_qsort): use qsort_s if available, for Microsoft

View file

@ -1542,6 +1542,19 @@ cdhash_set_label_i(VALUE key, VALUE val, void *ptr)
return ST_CONTINUE;
}
static inline VALUE
get_ivar_ic_value(rb_iseq_t *iseq,ID id)
{
VALUE val;
st_table *tbl = ISEQ_COMPILE_DATA(iseq)->ivar_cache_table;
if(!st_lookup(tbl,(st_data_t)id,&val)){
val = INT2FIX(iseq->body->is_size++);
st_insert(tbl,id,val);
}
return val;
}
/**
ruby insn object list -> raw instruction sequence
*/
@ -4604,7 +4617,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN(ret, line, dup);
}
ADD_INSN2(ret, line, setinstancevariable,
ID2SYM(node->nd_vid), INT2FIX(iseq->body->is_size++));
ID2SYM(node->nd_vid),
get_ivar_ic_value(iseq,node->nd_vid));
break;
}
case NODE_CDECL:{
@ -5415,7 +5429,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
debugi("nd_vid", node->nd_vid);
if (!poped) {
ADD_INSN2(ret, line, getinstancevariable,
ID2SYM(node->nd_vid), INT2FIX(iseq->body->is_size++));
ID2SYM(node->nd_vid),
get_ivar_ic_value(iseq,node->nd_vid));
}
break;
}
@ -8474,4 +8489,3 @@ iseq_ibf_load_extra_data(VALUE str)
RB_GC_GUARD(loader_obj);
return extra_str;
}

4
iseq.c
View file

@ -58,6 +58,8 @@ compile_data_free(struct iseq_compile_data *compile_data)
ruby_xfree(cur);
cur = next;
}
st_free_table(compile_data->ivar_cache_table);
ruby_xfree(compile_data);
}
}
@ -298,6 +300,8 @@ prepare_iseq_build(rb_iseq_t *iseq,
ISEQ_COMPILE_DATA(iseq)->option = option;
ISEQ_COMPILE_DATA(iseq)->last_coverable_line = -1;
ISEQ_COMPILE_DATA(iseq)->ivar_cache_table = st_init_numtable();
if (option->coverage_enabled) {
VALUE coverages = rb_get_coverages();
if (RTEST(coverages)) {

1
iseq.h
View file

@ -213,6 +213,7 @@ struct iseq_compile_data {
unsigned int ci_index;
unsigned int ci_kw_index;
const rb_compile_option_t *option;
st_table *ivar_cache_table;
#if SUPPORT_JOKE
st_table *labels_table;
#endif