[ruby-cvs:71916] k0kubun:r64824 (trunk): insns.def: optimize & and | of Integer [experimental]

k0kubun at ruby-lang.org k0kubun at ruby-lang.org
Mon Sep 24 21:40:28 JST 2018


k0kubun	2018-09-24 21:40:28 +0900 (Mon, 24 Sep 2018)

  New Revision: 64824

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64824

  Log:
    insns.def: optimize & and | of Integer [experimental]
    
    not optimizing Array#& and Array#| because vm_insnhelper.c can't easily
    inline it (large amount of array.c code would be needed in vm_insnhelper.c)
    and the method body is a little complicated compared to Integer's ones.
    So I thought only Integer#& and Integer#| have a significant impact,
    and eliminating unnecessary branches would contribute to JIT's performance.
    
    vm_insnhelper.c: ditto
    
    tool/transform_mjit_header.rb: make sure these instructions are inlined
    on JIT.
    
    compile.c: compile vm_opt_and and vm_opt_or.
    id.def: define id for them to be used in compile.c and vm*.c
    vm.c: track redefinition of Integer#& and Integer#|
    vm_core.h: allow detecting redefinition of & and |
    
    test/ruby/test_jit.rb: test new insns
    test/ruby/test_optimization.rb: ditto
    
    * Optcarrot benchmark
    
    This is a kind of experimental thing but I'm committing this since the
    performance impact is significant especially on Optcarrot with JIT.
    
    $ benchmark-driver benchmark.yml --rbenv 'before::before --disable-gems;before+JIT::before --disable-gems --jit;after::after --disable-gems;after+JIT::after --disable-gems --jit' -v --repeat-count 24
    before: ruby 2.6.0dev (2018-09-24 trunk 64821) [x86_64-linux]
    before+JIT: ruby 2.6.0dev (2018-09-24 trunk 64821) +JIT [x86_64-linux]
    after: ruby 2.6.0dev (2018-09-24 opt_and 64821) [x86_64-linux]
    last_commit=opt_or
    after+JIT: ruby 2.6.0dev (2018-09-24 opt_and 64821) +JIT [x86_64-linux]
    last_commit=opt_or
    Calculating -------------------------------------
                                 before  before+JIT       after   after+JIT
    Optcarrot Lan_Master.nes     51.460      66.315      53.023      71.173 fps
    
    Comparison:
                 Optcarrot Lan_Master.nes
                   after+JIT:        71.2 fps
                  before+JIT:        66.3 fps - 1.07x  slower
                       after:        53.0 fps - 1.34x  slower
                      before:        51.5 fps - 1.38x  slower
    
    [close https://github.com/ruby/ruby/pull/1963]

  Modified files:
    trunk/compile.c
    trunk/defs/id.def
    trunk/insns.def
    trunk/test/ruby/test_jit.rb
    trunk/test/ruby/test_optimization.rb
    trunk/tool/transform_mjit_header.rb
    trunk/vm.c
    trunk/vm_core.h
    trunk/vm_insnhelper.c


More information about the ruby-cvs mailing list