diff options
author | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-11 12:50:38 +0000 |
---|---|---|
committer | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-11 12:50:38 +0000 |
commit | 938f9066cb0a2eca20ced81b82f23a9444b8c5d5 (patch) | |
tree | 94e8ea351d2be63dac3c3918b4005a12f6e9b79f /compile.c | |
parent | ddd9f2310a476cfcd24d854466b7d0eac5216607 (diff) | |
download | ruby-938f9066cb0a2eca20ced81b82f23a9444b8c5d5.tar.gz |
* 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
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 20 |
1 files changed, 17 insertions, 3 deletions
@@ -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; } - |