ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:123069] [Ruby Bug#21553] Remove opt_aref_with and opt_aset_with instructions
@ 2025-08-25 23:51 tenderlovemaking (Aaron Patterson) via ruby-core
  2025-08-26 18:03 ` [ruby-core:123081] [Ruby Feature#21553] " ko1 (Koichi Sasada) via ruby-core
  2025-08-27  3:22 ` [ruby-core:123083] " k0kubun (Takashi Kokubun) via ruby-core
  0 siblings, 2 replies; 3+ messages in thread
From: tenderlovemaking (Aaron Patterson) via ruby-core @ 2025-08-25 23:51 UTC (permalink / raw)
  To: ruby-core; +Cc: tenderlovemaking (Aaron Patterson)

Issue #21553 has been reported by tenderlovemaking (Aaron Patterson).

----------------------------------------
Bug #21553: Remove opt_aref_with and opt_aset_with instructions
https://bugs.ruby-lang.org/issues/21553

* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
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:

```ruby
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



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:123081] [Ruby Feature#21553] Remove opt_aref_with and opt_aset_with instructions
  2025-08-25 23:51 [ruby-core:123069] [Ruby Bug#21553] Remove opt_aref_with and opt_aset_with instructions tenderlovemaking (Aaron Patterson) via ruby-core
@ 2025-08-26 18:03 ` ko1 (Koichi Sasada) via ruby-core
  2025-08-27  3:22 ` [ruby-core:123083] " k0kubun (Takashi Kokubun) via ruby-core
  1 sibling, 0 replies; 3+ messages in thread
From: ko1 (Koichi Sasada) via ruby-core @ 2025-08-26 18:03 UTC (permalink / raw)
  To: ruby-core; +Cc: ko1 (Koichi Sasada)

Issue #21553 has been updated by ko1 (Koichi Sasada).


no problem.
(I don't introduce this instruction so I'm not sure I can say Okay...)

----------------------------------------
Feature #21553: Remove opt_aref_with and opt_aset_with instructions
https://bugs.ruby-lang.org/issues/21553#change-114391

* Author: tenderlovemaking (Aaron Patterson)
* Status: Open
----------------------------------------
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:

```ruby
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



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:123083] [Ruby Feature#21553] Remove opt_aref_with and opt_aset_with instructions
  2025-08-25 23:51 [ruby-core:123069] [Ruby Bug#21553] Remove opt_aref_with and opt_aset_with instructions tenderlovemaking (Aaron Patterson) via ruby-core
  2025-08-26 18:03 ` [ruby-core:123081] [Ruby Feature#21553] " ko1 (Koichi Sasada) via ruby-core
@ 2025-08-27  3:22 ` k0kubun (Takashi Kokubun) via ruby-core
  1 sibling, 0 replies; 3+ messages in thread
From: k0kubun (Takashi Kokubun) via ruby-core @ 2025-08-27  3:22 UTC (permalink / raw)
  To: ruby-core; +Cc: k0kubun (Takashi Kokubun)

Issue #21553 has been updated by k0kubun (Takashi Kokubun).


ref: [Bug #9382], commit:58f800a278b8b70463f4afdbb23a918d8ab441ff

----------------------------------------
Feature #21553: Remove opt_aref_with and opt_aset_with instructions
https://bugs.ruby-lang.org/issues/21553#change-114394

* Author: tenderlovemaking (Aaron Patterson)
* Status: Closed
----------------------------------------
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:

```ruby
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



-- 
https://bugs.ruby-lang.org/
______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-08-27  3:24 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-08-25 23:51 [ruby-core:123069] [Ruby Bug#21553] Remove opt_aref_with and opt_aset_with instructions tenderlovemaking (Aaron Patterson) via ruby-core
2025-08-26 18:03 ` [ruby-core:123081] [Ruby Feature#21553] " ko1 (Koichi Sasada) via ruby-core
2025-08-27  3:22 ` [ruby-core:123083] " k0kubun (Takashi Kokubun) via ruby-core

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).