Feature #17291
openOptimize __send__ call
Description
I made a patch to optimize a __send__ call. This optimization replaces a __send__ method call with a call of the method whose name is the first argument of __send__ method. The patch is available in this pull-request.
By this change, the redefined __send__ method is no longer called when it is called by a symbol method name. I guess it is no problem because the following warning message is displayed for a long time.
$ ruby -e 'def __send__; end'
-e:1: warning: redefining `__send__' may cause serious problems
This proposal introduces two new instructions: sendsym and opt_sendsym_without_block.  These instructions handle the cases that the first argument of __send__ method is not a symbol literal.  I think I can combine these two instructions into one if prefered.
This proposal includes the change proposed in #17288. I'll mark it as a duplicate of this proposal.
I don't handle send method in this proposal. The reason is that we need to examine the redefinition of send method in the instruction execution time. I want to discuss only __send__ method in this ticket.
The benchmark result is below:
# Iteration per second (i/s)
|                 |compare-ruby|built-ruby|
|:----------------|-----------:|---------:|
|vm_send_sym      |     18.001M|  112.208M|
|                 |           -|     6.23x|
|vm_send_var      |     17.779M|   30.922M|
|                 |           -|     1.74x|
|vm_send_var_alt  |      3.817M|    6.817M|
|                 |           -|     1.79x|