Project

General

Profile

Actions

Feature #21553

open

Remove opt_aref_with and opt_aset_with instructions

Added by tenderlovemaking (Aaron Patterson) about 15 hours ago. Updated about 15 hours ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:123069]

Description

Hi,

I'd like to remove the opt_aref_with and opt_aset_with instructions. I think they are fairly rare these days. Removing them will simplify the YARV compiler, the JIT compilers, and fix an issue with warnings.

For background, these instructions are used with code like foo["bar"], but only when the string literal isn't frozen:

> ./miniruby --dump=insns -e'foo["bar"]'
== disasm: #<ISeq:<main>@-e:1 (1,0)-(1,10)>
0000 putself                                                          (   1)[Li]
0001 opt_send_without_block                 <calldata!mid:foo, argc:0, FCALL|VCALL|ARGS_SIMPLE>
0003 opt_aref_with                          "bar", <calldata!mid:[], argc:1, ARGS_SIMPLE>
0006 leave

Enabling frozen string literals will use putobject with opt_aref:

> ./miniruby --dump=insns --enable=frozen-string-literal  -e'foo["bar"]'
== disasm: #<ISeq:<main>@-e:1 (1,0)-(1,10)>
0000 putself                                                          (   1)[Li]
0001 opt_send_without_block                 <calldata!mid:foo, argc:0, FCALL|VCALL|ARGS_SIMPLE>
0003 putobject                              "bar"
0005 opt_aref                               <calldata!mid:[], argc:1, ARGS_SIMPLE>[CcCr]
0007 leave

The optimization avoids duping the string if the receiver happens to be a hash. I tested this with YJIT benchmarks and didn't see any impact. To be sure, I checked the lobsters benchmark to find uses of this instruction, and I found it was only used 4 times during any particular request which explained why removing the instruction didn't impact runtime performance.

Also, removing these instructions fixes a bug where a "chilled string warning" won't show up.

For example:

class Foo
  def self.[](x)= x.gsub!(/hello/, "hi")
end

Foo["hello world"]

I would expect to see a "chilled string" warning with this code, but no warning shows up. Removing these instructions makes the warning show up as expected.

I sent a patch to remove the instructions here: https://github.com/ruby/ruby/pull/14336

Actions

Also available in: Atom PDF

Like0
Like0