s/CALL_SIMPLE_METHOD/DISPATCH_ORIGINAL_INSN/

Now that DISPATCH_ORIGINAL_INSN is introduced, we can replace
CALL_SIMPLE_METHOD with DISPATCH_ORIGINAL_INSN. These two macros
differ in size very much and results in this big difference in
compiled binary size. This changeset reduces the size of
vm_exec_core from 32,352 bytes to 27,008 bytes on my machine.  As
a result it yields slightly better performance.
Closes [GH-1779].

-----------------------------------------------------------
benchmark results:
minimum results in each 3 measurements.
Execution time (sec)
name    before  after
so_ackermann     0.484  0.454
so_array         0.837  0.779
so_binary_trees  5.928  5.801
so_concatenate   3.473  3.543
so_count_words   0.201  0.222
so_exception     0.255  0.252
so_fannkuch      1.080  1.019
so_fasta         1.459  1.463
so_k_nucleotide  1.218  1.180
so_lists         0.499  0.484
so_mandelbrot    2.189  2.324
so_matrix        0.510  0.496
so_meteor_contest        3.025  2.925
so_nbody         1.319  1.273
so_nested_loop   0.941  0.932
so_nsieve        1.806  1.647
so_nsieve_bits   2.151  2.078
so_object        0.632  0.621
so_partial_sums  1.560  1.632
so_pidigits      1.190  1.183
so_random        0.333  0.353
so_reverse_complement    0.604  0.586
so_sieve         0.521  0.481
so_spectralnorm  1.774  1.722

Speedup ratio: compare with the result of `before' (greater is better)
name    after
so_ackermann    1.065
so_array        1.075
so_binary_trees 1.022
so_concatenate  0.980
so_count_words  0.903
so_exception    1.009
so_fannkuch     1.059
so_fasta        0.997
so_k_nucleotide 1.032
so_lists        1.032
so_mandelbrot   0.942
so_matrix       1.028
so_meteor_contest       1.034
so_nbody        1.036
so_nested_loop  1.009
so_nsieve       1.097
so_nsieve_bits  1.035
so_object       1.018
so_partial_sums 0.956
so_pidigits     1.006
so_random       0.943
so_reverse_complement   1.032
so_sieve        1.083
so_spectralnorm 1.030

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62088 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2018-01-29 07:04:50 +00:00
Родитель 7d4ad74f22
Коммит 31ecd18f1a
2 изменённых файлов: 31 добавлений и 76 удалений

Просмотреть файл

@ -709,6 +709,7 @@ send
(CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq) (CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq)
(...) (...)
(VALUE val) (VALUE val)
// attr bool handles_frame = true;
// attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0)); // attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0));
{ {
struct rb_calling_info calling; struct rb_calling_info calling;
@ -772,6 +773,7 @@ opt_send_without_block
(CALL_INFO ci, CALL_CACHE cc) (CALL_INFO ci, CALL_CACHE cc)
(...) (...)
(VALUE val) (VALUE val)
// attr bool handles_frame = true;
// attr rb_snum_t sp_inc = -ci->orig_argc; // attr rb_snum_t sp_inc = -ci->orig_argc;
{ {
struct rb_calling_info calling; struct rb_calling_info calling;
@ -786,6 +788,7 @@ invokesuper
(CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq) (CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq)
(...) (...)
(VALUE val) (VALUE val)
// attr bool handles_frame = true;
// attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0)); // attr rb_snum_t sp_inc = - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0));
{ {
struct rb_calling_info calling; struct rb_calling_info calling;
@ -803,6 +806,7 @@ invokeblock
(CALL_INFO ci) (CALL_INFO ci)
(...) (...)
(VALUE val) (VALUE val)
// attr bool handles_frame = true;
// attr rb_snum_t sp_inc = 1 - ci->orig_argc; // attr rb_snum_t sp_inc = 1 - ci->orig_argc;
{ {
struct rb_calling_info calling; struct rb_calling_info calling;
@ -1002,10 +1006,7 @@ opt_plus
val = vm_opt_plus(recv, obj); val = vm_opt_plus(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1019,10 +1020,7 @@ opt_minus
val = vm_opt_minus(recv, obj); val = vm_opt_minus(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1036,10 +1034,7 @@ opt_mult
val = vm_opt_mult(recv, obj); val = vm_opt_mult(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1053,10 +1048,7 @@ opt_div
val = vm_opt_div(recv, obj); val = vm_opt_div(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1070,10 +1062,7 @@ opt_mod
val = vm_opt_mod(recv, obj); val = vm_opt_mod(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1087,10 +1076,7 @@ opt_eq
val = opt_eq_func(recv, obj, ci, cc); val = opt_eq_func(recv, obj, ci, cc);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1100,6 +1086,7 @@ opt_neq
(CALL_INFO ci, CALL_CACHE cc, CALL_INFO ci_eq, CALL_CACHE cc_eq) (CALL_INFO ci, CALL_CACHE cc, CALL_INFO ci_eq, CALL_CACHE cc_eq)
(VALUE recv, VALUE obj) (VALUE recv, VALUE obj)
(VALUE val) (VALUE val)
// attr bool handles_frame = true;
{ {
val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj); val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj);
@ -1121,10 +1108,7 @@ opt_lt
val = vm_opt_lt(recv, obj); val = vm_opt_lt(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1138,10 +1122,7 @@ opt_le
val = vm_opt_le(recv, obj); val = vm_opt_le(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1155,10 +1136,7 @@ opt_gt
val = vm_opt_gt(recv, obj); val = vm_opt_gt(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1172,10 +1150,7 @@ opt_ge
val = vm_opt_ge(recv, obj); val = vm_opt_ge(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1189,10 +1164,7 @@ opt_ltlt
val = vm_opt_ltlt(recv, obj); val = vm_opt_ltlt(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1206,10 +1178,7 @@ opt_aref
val = vm_opt_aref(recv, obj); val = vm_opt_aref(recv, obj);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1223,11 +1192,7 @@ opt_aset
val = vm_opt_aset(recv, obj, set); val = vm_opt_aset(recv, obj, set);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
PUSH(obj);
PUSH(set);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1237,6 +1202,7 @@ opt_aset_with
(CALL_INFO ci, CALL_CACHE cc, VALUE key) (CALL_INFO ci, CALL_CACHE cc, VALUE key)
(VALUE recv, VALUE val) (VALUE recv, VALUE val)
(VALUE val) (VALUE val)
// attr bool handles_frame = true;
{ {
VALUE tmp = vm_opt_aset_with(recv, key, val); VALUE tmp = vm_opt_aset_with(recv, key, val);
@ -1258,6 +1224,7 @@ opt_aref_with
(CALL_INFO ci, CALL_CACHE cc, VALUE key) (CALL_INFO ci, CALL_CACHE cc, VALUE key)
(VALUE recv) (VALUE recv)
(VALUE val) (VALUE val)
// attr bool handles_frame = true;
{ {
val = vm_opt_aref_with(recv, key); val = vm_opt_aref_with(recv, key);
@ -1279,9 +1246,7 @@ opt_length
val = vm_opt_length(recv, BOP_LENGTH); val = vm_opt_length(recv, BOP_LENGTH);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1295,9 +1260,7 @@ opt_size
val = vm_opt_length(recv, BOP_SIZE); val = vm_opt_length(recv, BOP_SIZE);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1311,9 +1274,7 @@ opt_empty_p
val = vm_opt_empty_p(recv); val = vm_opt_empty_p(recv);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1327,9 +1288,7 @@ opt_succ
val = vm_opt_succ(recv); val = vm_opt_succ(recv);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1343,9 +1302,7 @@ opt_not
val = vm_opt_not(ci, cc, recv); val = vm_opt_not(ci, cc, recv);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(recv);
CALL_SIMPLE_METHOD(recv);
} }
} }
@ -1369,10 +1326,7 @@ opt_regexpmatch2
val = vm_opt_regexpmatch2(obj2, obj1); val = vm_opt_regexpmatch2(obj2, obj1);
if (val == Qundef) { if (val == Qundef) {
/* other */ DISPATCH_ORIGINAL_INSN(opt_send_without_block);
PUSH(obj2);
PUSH(obj1);
CALL_SIMPLE_METHOD(obj2);
} }
} }

Просмотреть файл

@ -69,9 +69,11 @@ class RubyVM::BareInstructions
return @variables \ return @variables \
. values \ . values \
. group_by {|h| h[:type] } \ . group_by {|h| h[:type] } \
. sort_by {|t, v| t } \
. map {|t, v| [t, v.map {|i| i[:name] }.sort ] } \ . map {|t, v| [t, v.map {|i| i[:name] }.sort ] } \
. map {|t, v| sprintf("%s %s", t, v.join(', ')) } \ . map {|t, v|
. sort sprintf("MAYBE_UNUSED(%s) %s", t, v.join(', '))
}
end end
def preamble def preamble
@ -127,8 +129,7 @@ class RubyVM::BareInstructions
generate_attribute 'rb_num_t', 'retn', rets.size generate_attribute 'rb_num_t', 'retn', rets.size
generate_attribute 'rb_num_t', 'width', width generate_attribute 'rb_num_t', 'width', width
generate_attribute 'rb_num_t', 'sp_inc', rets.size - pops.size generate_attribute 'rb_num_t', 'sp_inc', rets.size - pops.size
generate_attribute 'bool', 'handles_frame', \ generate_attribute 'bool', 'handles_frame', false
opes.any? {|o| /CALL_INFO/ =~ o[:type] }
end end
def typesplit a def typesplit a