[#109115] [Ruby master Misc#18891] Expand tabs in C code — "k0kubun (Takashi Kokubun)" <noreply@...>

Issue #18891 has been reported by k0kubun (Takashi Kokubun).

13 messages 2022/07/02

[#109118] [Ruby master Bug#18893] Don't redefine memcpy(3) — "alx (Alejandro Colomar)" <noreply@...>

Issue #18893 has been reported by alx (Alejandro Colomar).

11 messages 2022/07/02

[#109152] [Ruby master Bug#18899] Inconsistent argument handling in IO#set_encoding — "javanthropus (Jeremy Bopp)" <noreply@...>

Issue #18899 has been reported by javanthropus (Jeremy Bopp).

10 messages 2022/07/06

[#109193] [Ruby master Bug#18909] ARGF.readlines reads more than current file — "JohanJosefsson (Johan Josefsson)" <noreply@...>

Issue #18909 has been reported by JohanJosefsson (Johan Josefsson).

17 messages 2022/07/13

[#109196] [Ruby master Bug#18911] Process._fork hook point is not called when Process.daemon is used — "ivoanjo (Ivo Anjo)" <noreply@...>

Issue #18911 has been reported by ivoanjo (Ivo Anjo).

9 messages 2022/07/13

[#109201] [Ruby master Bug#18912] Build failure with macOS 13 (Ventura) Beta — "hsbt (Hiroshi SHIBATA)" <noreply@...>

Issue #18912 has been reported by hsbt (Hiroshi SHIBATA).

20 messages 2022/07/14

[#109206] [Ruby master Bug#18914] Segmentation fault during Ruby test suite execution — "jprokop (Jarek Prokop)" <noreply@...>

Issue #18914 has been reported by jprokop (Jarek Prokop).

8 messages 2022/07/14

[#109207] [Ruby master Feature#18915] New error class: NotImplementedYetError or scope change for NotImplementedYet — Quintasan <noreply@...>

Issue #18915 has been reported by Quintasan (Michał Zając).

18 messages 2022/07/14

[#109260] [Ruby master Feature#18930] Officially deprecate class variables — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18930 has been reported by Eregon (Benoit Daloze).

21 messages 2022/07/20

[#109314] [Ruby master Bug#18938] Backport cf7d07570f50ef9c16007019afcff11ba6500d70 — "byroot (Jean Boussier)" <noreply@...>

Issue #18938 has been reported by byroot (Jean Boussier).

8 messages 2022/07/25

[#109371] [Ruby master Feature#18949] Deprecate and remove replicate and dummy encodings — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18949 has been reported by Eregon (Benoit Daloze).

35 messages 2022/07/29

[ruby-core:109345] [Ruby master Feature#18943] New constant caching instruction: opt_getconstant_path

From: "jhawthorn (John Hawthorn)" <noreply@...>
Date: 2022-07-28 00:15:55 UTC
List: ruby-core #109345
Issue #18943 has been reported by jhawthorn (John Hawthorn).

----------------------------------------
Feature #18943: New constant caching instruction: opt_getconstant_path
https://bugs.ruby-lang.org/issues/18943

* Author: jhawthorn (John Hawthorn)
* Status: Open
* Priority: Normal
----------------------------------------
I'd like to propose the change to the bytecode for constant caching.
I've submitted this improvement via pull request at https://github.com/ruby/ruby/pull/6187 and also attached a patch to this issue.

Previously YARV bytecode implemented constant caching by having a pair of instructions, `opt_getinlinecache` and `opt_setinlinecache`, wrapping a series of `getconstant` calls (with `putobject` providing supporting arguments).

```
# old
$ ruby --dump=insns -e 'Foo::Bar::Baz'
== disasm: #<ISeq:<main>@-e:1 (1,0)-(1,13)> (catch: FALSE)
0000 opt_getinlinecache                     17, <is:0>                (   1)[Li]
0003 putobject                              true
0005 getconstant                            :Foo
0007 putobject                              false
0009 getconstant                            :Bar
0011 putobject                              false
0013 getconstant                            :Baz
0015 opt_setinlinecache                     <is:0>
0017 leave
```

This commit replaces that pattern with a new instruction, `opt_getconstant_path`, handling both getting/setting the inline cache and fetching the constant on a cache miss.

This is implemented by storing the full constant path as a null-terminated array of IDs inside of the IC structure. `idNULL` is used to signal an absolute constant reference.

```
# new
$ ./miniruby --dump=insns -e '::Foo::Bar::Baz'
== disasm: #<ISeq:<main>@-e:1 (1,0)-(1,13)> (catch: FALSE)
0000 opt_getconstant_path                   <ic:0 ::Foo::Bar::Baz>      (   1)[Li]
0002 leave
```

The motivation for this is that we had increasingly found the need to disassemble the instructions between the `opt_getinlinecache` and `opt_setinlinecache` in order to determine the constant we are fetching, or otherwise store metadata.

This disassembly was previously done:
* In `opt_setinlinecache`, to register the `IC` against the constant names it is using for granular invalidation.
* In `rb_iseq_free`, to unregister the IC from the invalidation table.
* In YJIT to find the position of a `opt_getinlinecache` instruction to invalidate it when the cache is populated
* In YJIT to register the constant names being used for invalidation.

With this change we no longer need disassembly for these (in fact `rb_iseq_each` is now unused and is removed in the PR), as the list of constant names being referenced is held in the `IC`. This should also make it possible to make more optimizations in the future.

This may also reduce the size of iseqs, as previously each segment required 32 bytes (assuming 64-bit platform) for each constant segment. This implementation only stores one 8-byte `ID` per-segment .

There should be no significant performance difference between this and the previous implementation. Previously `opt_getinlinecache` was a "leaf" instruction, but it included a jump (almost always to a separate cache line). Now `opt_getconstant_path` is a non-leaf (it may raise/autoload/call `const_missing`) but it does not jump. These seem to even out. This also removes a field from the IC structure that was needed by YJIT, but adds the `ID *segments` field, so the size remains the same.

---Files--------------------------------
0001-New-constant-caching-insn-opt_getconstant_path.patch (61.3 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next