From: abhsha20@... Date: 2020-06-12T11:44:15+00:00 Subject: [ruby-core:98762] [Ruby master Bug#16941] MJIT doesn't identify Struct kind of instruction Issue #16941 has been updated by abhsha (Abhishek Sharma). Hello K0kubun, Here is the revised script ``` def my_method a_struct = Struct.new(:a).new a_struct.a = "a" puts "Inside this Method" end 3.times{ puts "=="; my_method; puts "==" } ``` Output with --jit-min-calls=1 ``` ruby --jit-save-temps --disable-gems --jit-min-calls=1 --jit-verbose=2 --jit-wait test.rb MJIT: CC defaults to /tool/pandora64/bin/gcc MJIT: tmp_dir is /tmp Creating precompiled header Starting process: /tool/pandora64/bin/gcc /tool/pandora64/bin/gcc -w -Wfatal-errors -fPIC -shared -w -pipe -O3 -o /tmp/_ruby_mjit_hp23581u0.h.gch /tool/pandora64/.package/ruby-2.6.0/include/ruby-2.6.0/x86_64-linux/rb_mjit_min_header-2.6.0.h start compilation: block in
@test.rb:7 -> /tmp/_ruby_mjit_p23581u0.c Starting process: /tool/pandora64/bin/gcc /tool/pandora64/bin/gcc -w -Wfatal-errors -fPIC -shared -w -pipe -O3 -o /tmp/_ruby_mjit_p23581u0.o /tmp/_ruby_mjit_p23581u0.c -c -Wl,--compress-debug-sections=zlib -nostartfiles -nodefaultlibs -nostdlib Starting process: /tool/pandora64/bin/gcc /tool/pandora64/bin/gcc -shared -Wfatal-errors -fPIC -shared -w -pipe -O3 -o /tmp/_ruby_mjit_p23581u0.so /tmp/_ruby_mjit_p23581u0.o -Wl,--compress-debug-sections=zlib -nostartfiles -nodefaultlibs -nostdlib JIT success (119.4ms): block in
@test.rb:7 -> /tmp/_ruby_mjit_p23581u0.c == start compilation: my_method@test.rb:1 -> /tmp/_ruby_mjit_p23581u1.c Starting process: /tool/pandora64/bin/gcc /tool/pandora64/bin/gcc -w -Wfatal-errors -fPIC -shared -w -pipe -O3 -o /tmp/_ruby_mjit_p23581u1.o /tmp/_ruby_mjit_p23581u1.c -c -Wl,--compress-debug-sections=zlib -nostartfiles -nodefaultlibs -nostdlib Starting process: /tool/pandora64/bin/gcc /tool/pandora64/bin/gcc -shared -Wfatal-errors -fPIC -shared -w -pipe -O3 -o /tmp/_ruby_mjit_p23581u1.so /tmp/_ruby_mjit_p23581u1.o -Wl,--compress-debug-sections=zlib -nostartfiles -nodefaultlibs -nostdlib JIT success (176.5ms): my_method@test.rb:1 -> /tmp/_ruby_mjit_p23581u1.c start compilation: a=@test.rb:2 -> /tmp/_ruby_mjit_p23581u2.c MJIT warning: Skipped to compile unsupported instruction: opt_call_c_function JIT failure (0.0ms): a=@test.rb:2 -> /tmp/_ruby_mjit_p23581u2.c Inside this Method == == start compilation: a=@test.rb:2 -> /tmp/_ruby_mjit_p23581u3.c MJIT warning: Skipped to compile unsupported instruction: opt_call_c_function JIT failure (0.0ms): a=@test.rb:2 -> /tmp/_ruby_mjit_p23581u3.c Inside this Method == == start compilation: a=@test.rb:2 -> /tmp/_ruby_mjit_p23581u4.c MJIT warning: Skipped to compile unsupported instruction: opt_call_c_function JIT failure (0.0ms): a=@test.rb:2 -> /tmp/_ruby_mjit_p23581u4.c Inside this Method == Stopping worker thread Successful MJIT finish ``` From the documentation, I understand on 1st (jit-min-calls) call a method gets queued to be "JITed", and since I'm using --jit-wait, it waits for the method to get JIT-compiled. The only problem here is that it doesn't consider if a process has been attempted to get JITed before and has failed to do so. Therefore it attempts to recompile again and again. I have a more greedy thought, is it possible to have a mechanism to persist the JITed methods and load on a later point of time? This could be useful for creating fast gems without the need to use the C interface to write code. Also, it can be a useful scenario, where the same code runs for very large number of times. For Example, delivering software to the client, where he is just interested in running the software as a black box and get desired output. Thanks, Abhishek ---------------------------------------- Bug #16941: MJIT doesn't identify Struct kind of instruction https://bugs.ruby-lang.org/issues/16941#change-86120 * Author: abhsha (Abhishek Sharma) * Status: Feedback * Priority: Normal * Assignee: k0kubun (Takashi Kokubun) * ruby -v: 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- MJIT does not identify Struct instructions and gives a warning while compiling to C. Example: def my_method 1.times do a_struct = Struct.new(:a).new a_struct.a = "a" end end my_method $: ruby --jit-save-temps --jit-min-calls=1 --disable-gems --jit --jit-verbose=2 --jit-wait test.rb output: start compilation: a=@test.rb:3 -> /tmp/_ruby_mjit_p30696u2.c MJIT warning: Skipped to compile unsupported instruction: opt_call_c_function JIT failure (0.0ms): a=@test.rb:3 -> /tmp/_ruby_mjit_p30696u2.c Are structs not recognised by JIT compiler? We have this call in our programs many number of times (~ 10^6), it attempts every time and fails. Can this be a cause of programs to get slower with --jit enabled ? -- https://bugs.ruby-lang.org/ Unsubscribe: