* 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:
parent
ac8c23f1b5
commit
44916ec448
13
ChangeLog
13
ChangeLog
@ -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>
|
Wed May 11 17:18:53 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* util.c (ruby_qsort): use qsort_s if available, for Microsoft
|
* util.c (ruby_qsort): use qsort_s if available, for Microsoft
|
||||||
|
20
compile.c
20
compile.c
@ -1542,6 +1542,19 @@ cdhash_set_label_i(VALUE key, VALUE val, void *ptr)
|
|||||||
return ST_CONTINUE;
|
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
|
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_INSN(ret, line, dup);
|
||||||
}
|
}
|
||||||
ADD_INSN2(ret, line, setinstancevariable,
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case NODE_CDECL:{
|
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);
|
debugi("nd_vid", node->nd_vid);
|
||||||
if (!poped) {
|
if (!poped) {
|
||||||
ADD_INSN2(ret, line, getinstancevariable,
|
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;
|
break;
|
||||||
}
|
}
|
||||||
@ -8474,4 +8489,3 @@ iseq_ibf_load_extra_data(VALUE str)
|
|||||||
RB_GC_GUARD(loader_obj);
|
RB_GC_GUARD(loader_obj);
|
||||||
return extra_str;
|
return extra_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
iseq.c
4
iseq.c
@ -58,6 +58,8 @@ compile_data_free(struct iseq_compile_data *compile_data)
|
|||||||
ruby_xfree(cur);
|
ruby_xfree(cur);
|
||||||
cur = next;
|
cur = next;
|
||||||
}
|
}
|
||||||
|
st_free_table(compile_data->ivar_cache_table);
|
||||||
|
|
||||||
ruby_xfree(compile_data);
|
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)->option = option;
|
||||||
ISEQ_COMPILE_DATA(iseq)->last_coverable_line = -1;
|
ISEQ_COMPILE_DATA(iseq)->last_coverable_line = -1;
|
||||||
|
|
||||||
|
ISEQ_COMPILE_DATA(iseq)->ivar_cache_table = st_init_numtable();
|
||||||
|
|
||||||
if (option->coverage_enabled) {
|
if (option->coverage_enabled) {
|
||||||
VALUE coverages = rb_get_coverages();
|
VALUE coverages = rb_get_coverages();
|
||||||
if (RTEST(coverages)) {
|
if (RTEST(coverages)) {
|
||||||
|
1
iseq.h
1
iseq.h
@ -213,6 +213,7 @@ struct iseq_compile_data {
|
|||||||
unsigned int ci_index;
|
unsigned int ci_index;
|
||||||
unsigned int ci_kw_index;
|
unsigned int ci_kw_index;
|
||||||
const rb_compile_option_t *option;
|
const rb_compile_option_t *option;
|
||||||
|
st_table *ivar_cache_table;
|
||||||
#if SUPPORT_JOKE
|
#if SUPPORT_JOKE
|
||||||
st_table *labels_table;
|
st_table *labels_table;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user