Skip to content

[49.0.0] Backport some recent fixes/improvements from main - #14306

Merged
alexcrichton merged 3 commits into
bytecodealliance:release-49.0.0from
alexcrichton:backports
Sep 9, 2026
Merged

[49.0.0] Backport some recent fixes/improvements from main#14306
alexcrichton merged 3 commits into
bytecodealliance:release-49.0.0from
alexcrichton:backports

Conversation

@alexcrichton

Copy link
Copy Markdown
Member

fitzgen and others added 3 commits September 9, 2026 07:51
…14290)

This visits a block's predecessors before the block itself, which minimizes the
number of times we need to reprocess a block to reach the fixed point (ignoring
backedges).

Here are the Sightglass results (faster on 13/26 of the PCA subset; up to 1.02x
faster), plus some extra benchmarks that use 1000 different globals in order to
create benchmarks with many alias regions (up to 16.27x faster).

<details>

```
compilation :: cycles :: Sum Total

    Δ = 8422617.35 ± 280685.06 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.15x to 1.16x faster than 5e00554-baseline.dylib!

    ┌──────────┬──────────┬─────────────┬──────────┬─────────────────────────────┐
    │ Min      │ Max      │ Mean        │ Median   │ Engine                      │
    ├──────────┼──────────┼─────────────┼──────────┼─────────────────────────────┤
    │ 60331062 │ 64369397 │ 61754473.07 │ 61678752 │ 5e00554-baseline.dylib   │
    ├──────────┼──────────┼─────────────┼──────────┼─────────────────────────────┤
    │ 51846162 │ 55688043 │ 53331855.72 │ 53253352 │ c86906f168-A-rpo-seed.dylib │
    └──────────┴──────────┴─────────────┴──────────┴─────────────────────────────┘

compilation :: instructions-retired :: Sum Total

    Δ = 7583044017.87 ± 17783614.28 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.05x to 1.05x faster than 5e00554-baseline.dylib!

    ┌──────────────┬──────────────┬─────────────────┬──────────────┬─────────────────────────────┐
    │ Min          │ Max          │ Mean            │ Median       │ Engine                      │
    ├──────────────┼──────────────┼─────────────────┼──────────────┼─────────────────────────────┤
    │ 168815527589 │ 168999930832 │ 168907183902.21 │ 168906273009 │ 5e00554-baseline.dylib   │
    ├──────────────┼──────────────┼─────────────────┼──────────────┼─────────────────────────────┤
    │ 161221272391 │ 161466420307 │ 161324139884.34 │ 161323996892 │ c86906f168-A-rpo-seed.dylib │
    └──────────────┴──────────────┴─────────────────┴──────────────┴─────────────────────────────┘

compilation :: instructions-retired :: globals-1000-cfg

    Δ = 3488395020.90 ± 330370.05 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 16.27x to 16.27x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3714492504 │ 3720971964 │ 3716830864.19 │ 3716697153 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 227560263  │ 229543940  │ 228435843.29  │ 228446605  │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: instructions-retired :: globals-1000-loop

    Δ = 3676743569.51 ± 269112.72 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 14.98x to 14.99x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3938271014 │ 3942494061 │ 3939646001.25 │ 3939498236 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 262014252  │ 264993857  │ 262902431.74  │ 262817743  │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: cycles :: globals-1000-cfg

    Δ = 4080711.94 ± 12420.75 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 11.78x to 11.85x faster than 5e00554-baseline.dylib!

    ┌─────────┬─────────┬────────────┬─────────┬─────────────────────────────┐
    │ Min     │ Max     │ Mean       │ Median  │ Engine                      │
    ├─────────┼─────────┼────────────┼─────────┼─────────────────────────────┤
    │ 4353068 │ 4563437 │ 4458098.75 │ 4457209 │ 5e00554-baseline.dylib   │
    ├─────────┼─────────┼────────────┼─────────┼─────────────────────────────┤
    │ 325067  │ 427413  │ 377386.81  │ 377755  │ c86906f168-A-rpo-seed.dylib │
    └─────────┴─────────┴────────────┴─────────┴─────────────────────────────┘

compilation :: cycles :: globals-1000-loop

    Δ = 4104661.05 ± 14351.30 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 10.61x to 10.68x faster than 5e00554-baseline.dylib!

    ┌─────────┬─────────┬────────────┬─────────┬─────────────────────────────┐
    │ Min     │ Max     │ Mean       │ Median  │ Engine                      │
    ├─────────┼─────────┼────────────┼─────────┼─────────────────────────────┤
    │ 4397623 │ 4666018 │ 4530267.27 │ 4533174 │ 5e00554-baseline.dylib   │
    ├─────────┼─────────┼────────────┼─────────┼─────────────────────────────┤
    │ 370362  │ 491900  │ 425606.22  │ 428477  │ c86906f168-A-rpo-seed.dylib │
    └─────────┴─────────┴────────────┴─────────┴─────────────────────────────┘

compilation :: instructions-retired :: tinygo-json

    Δ = 107193076.80 ± 815883.64 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.02x to 1.02x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 5439283619 │ 5450038733 │ 5445123463.82 │ 5445131000 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 5332483991 │ 5345446881 │ 5337930387.02 │ 5337890931 │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: instructions-retired :: kotlin-richards

    Δ = 12093387.57 ± 584630.03 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.02x to 1.02x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 634797689 │ 643565242 │ 639630353.10 │ 639744730 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 623934476 │ 631123628 │ 627536965.53 │ 627528340 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘

compilation :: instructions-retired :: meshoptimizer

    Δ = 2362359.47 ± 404322.82 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.01x to 1.01x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 383858384 │ 390770689 │ 388053353.33 │ 388001245 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 383261763 │ 387923421 │ 385690993.86 │ 385615471 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘

compilation :: instructions-retired :: shootout-minicsv

    Δ = 601519.85 ± 472227.74 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.01x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 117035013 │ 123844363 │ 120882817.37 │ 121027989 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 116974294 │ 123132924 │ 120281297.52 │ 120136429 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘

compilation :: instructions-retired :: quicksort

    Δ = 881381.59 ± 416211.85 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.01x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 223787543 │ 229133325 │ 225969513.23 │ 225822591 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 222127742 │ 228398304 │ 225088131.64 │ 225055771 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘

compilation :: instructions-retired :: bz2

    Δ = 2312715.06 ± 480227.08 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 737107590 │ 743849687 │ 740178352.09 │ 740078124 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 734533054 │ 741353972 │ 737865637.03 │ 737898085 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘

compilation :: instructions-retired :: sqlite3

    Δ = 17102938.31 ± 978800.03 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 6543461309 │ 6560165030 │ 6551934323.03 │ 6551923670 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 6529868907 │ 6542054900 │ 6534831384.72 │ 6534691956 │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: instructions-retired :: spidermonkey-regex

    Δ = 118389649.00 ± 4827636.02 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌─────────────┬─────────────┬────────────────┬─────────────┬─────────────────────────────┐
    │ Min         │ Max         │ Mean           │ Median      │ Engine                      │
    ├─────────────┼─────────────┼────────────────┼─────────────┼─────────────────────────────┤
    │ 45963049179 │ 46016697865 │ 45985854571.04 │ 45984800772 │ 5e00554-baseline.dylib   │
    ├─────────────┼─────────────┼────────────────┼─────────────┼─────────────────────────────┤
    │ 45839879682 │ 45907160559 │ 45867464922.04 │ 45866804291 │ c86906f168-A-rpo-seed.dylib │
    └─────────────┴─────────────┴────────────────┴─────────────┴─────────────────────────────┘

compilation :: instructions-retired :: rust-compression

    Δ = 6712163.12 ± 856022.61 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3870353384 │ 3882887385 │ 3875855295.33 │ 3876293061 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3863295580 │ 3875095656 │ 3869143132.21 │ 3869057316 │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: instructions-retired :: regex

    Δ = 5669354.36 ± 632864.99 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3285972090 │ 3294088345 │ 3289597651.01 │ 3289541728 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3279840034 │ 3287764296 │ 3283928296.65 │ 3283956957 │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: instructions-retired :: tract-onnx-image-classification

    Δ = 135367927.19 ± 14795683.99 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌─────────────┬─────────────┬────────────────┬─────────────┬─────────────────────────────┐
    │ Min         │ Max         │ Mean           │ Median      │ Engine                      │
    ├─────────────┼─────────────┼────────────────┼─────────────┼─────────────────────────────┤
    │ 81407549211 │ 81562568478 │ 81475588637.09 │ 81473382979 │ 5e00554-baseline.dylib   │
    ├─────────────┼─────────────┼────────────────┼─────────────┼─────────────────────────────┤
    │ 81256299647 │ 81465756514 │ 81340220709.90 │ 81335906227 │ c86906f168-A-rpo-seed.dylib │
    └─────────────┴─────────────┴────────────────┴─────────────┴─────────────────────────────┘

compilation :: instructions-retired :: hex-simd

    Δ = 779004.92 ± 525403.40 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 508671283 │ 515352203 │ 512220005.11 │ 512185404 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 508728739 │ 515958257 │ 511441000.19 │ 511357702 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘

compilation :: instructions-retired :: libsodium-scalarmult_ed25519

    Δ = 885006.64 ± 499263.19 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 746252373 │ 753029861 │ 749924541.79 │ 749970953 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 745419599 │ 752737391 │ 749039535.15 │ 749090622 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘

compilation :: instructions-retired :: hashset

    Δ = 1571708.63 ± 1175700.98 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 1463796111 │ 1480612250 │ 1472991690.94 │ 1473144505 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 1464040534 │ 1477349536 │ 1471419982.31 │ 1471875364 │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: instructions-retired :: rust-html-rewriter

    Δ = 3230981.96 ± 641798.83 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌────────────┬────────────┬───────────────┬────────────┬─────────────────────────────┐
    │ Min        │ Max        │ Mean          │ Median     │ Engine                      │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3228518318 │ 3238197616 │ 3232722284.22 │ 3232812395 │ 5e00554-baseline.dylib   │
    ├────────────┼────────────┼───────────────┼────────────┼─────────────────────────────┤
    │ 3225242344 │ 3234092078 │ 3229491302.26 │ 3229350214 │ c86906f168-A-rpo-seed.dylib │
    └────────────┴────────────┴───────────────┴────────────┴─────────────────────────────┘

compilation :: instructions-retired :: rust-protobuf

    Δ = 705588.07 ± 582552.52 (confidence = 99%)

    c86906f168-A-rpo-seed.dylib is 1.00x to 1.00x faster than 5e00554-baseline.dylib!

    ┌───────────┬───────────┬──────────────┬───────────┬─────────────────────────────┐
    │ Min       │ Max       │ Mean         │ Median    │ Engine                      │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 722339594 │ 731951556 │ 728193145.67 │ 728326686 │ 5e00554-baseline.dylib   │
    ├───────────┼───────────┼──────────────┼───────────┼─────────────────────────────┤
    │ 723792262 │ 731022735 │ 727487557.60 │ 727470029 │ c86906f168-A-rpo-seed.dylib │
    └───────────┴───────────┴──────────────┴───────────┴─────────────────────────────┘
```

<details>
…l_overflow` lowering. (bytecodealliance#14295)

* Fix subtle ISLE extractor issue leading to incorrect matching in `*mul_overflow` lowering.

In bytecodealliance#14293, a test case that uses the *first* result (i.e., the product)
of an `smul_overflow` operator as a condition (e.g. as part of `icmp eq`
comparing to zero) incorrectly triggers the lowering rule I added in bytecodealliance#14254
which was meant to match only compare-to-zero on the *second* (overflow)
result.

This was a result if a fairly subtle issue involving auto-conversions in
ISLE. I had written

```
(rule (is_nonzero (second_result umul @ (smul_overflow ...)))
      ...)
```

where the intent was to match an `is_nonzero` (which is a helper term)
lowering with the second result (overflow flag) of the `smul_overflow`.

`second_result` has a term signature `(Value) Inst`, in other words it
takes an `Inst` and returns an `Option<Value>`.` `is_nonzero` takes a
`Value`. So we auto-convert the `Value` in the first arg position of
`is_nonzer` to an `Inst`; that uses `def_inst`, which looks up the
defining instruction of the given value. Then `second_result` takes that
`Inst` and gives the second value. But then the next level,
`(smul_overflow ...)`, *again* uses `def_inst` and goes from the (second
result) `Value` back to the inst and matches.

In other words, we're too permissive with the autoconversions on `Value`
to `Inst`; all of this was designed at a time when we more or less only
handled single-result instructions with any nontrivial lowering rule, so
the two were mostly interchangeable. The handling for the overflow-flag
ops changes that.

The specific step in that chain above that is unambiguously wrong wrt
intent is (first result) `Value` -> `Inst` -> `second_result` matching.
So this PR instead introduces `is_second_result` that is `Value` ->
`Option<Value>` and matches only when the specific `Value` is the second
result of an instruction.

This does have me thinking a bit more about the role that the `Value` ->
`Inst` autoconvert matching plays. It is absolutely essential to the
ergonomics of ISLE: without it, we couldn't write

```
(rule (lower (iadd (imul a b) c)) ...)
```

because `iadd`'s args are `Value`s and we need to match back to an
`Inst` for `imul`. *But* we also have cases like the one in this PR
where we really shouldn't be so permissive. Perhaps we want a kind of
type modifier (`=Value` ?) that means "exactly this type, not
autoconverted". I'll bring this up in the Cranelift meeting this week.

Fixes bytecodealliance#14293.

* Review feedback.

* Test minimization.
This commit adjust the previous `check_recursive_run` function found in
`concurrent.rs` to instead be a check of the now-present
`event_loop_running` bool. This allows disparate stores to run
recursively as there should be no issue with that but still requires
a single store just once and never recursively.

This was discovered in Spin's update to Wasmtime 49 at
spinframework/spin#3710 where delegation of an HTTP request from a p3
component (executed with `run_concurrent`) to a p2 component
(instantiated with `instantiate_async`) started panicking with this
recursive check in Wasmtime 49. The cause of this was the refactoring
in bytecodealliance#14146 where all instantiation now simulates the concurrent event
loop where enabled for the `start` function. Spin executes the
components in different stores, however, which is how this commit fixes
that case.
@alexcrichton
alexcrichton requested review from a team as code owners September 9, 2026 14:53
@alexcrichton
alexcrichton requested review from cfallin and removed request for a team September 9, 2026 14:53

@cfallin cfallin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@cfallin
cfallin enabled auto-merge (squash) September 9, 2026 15:09
@alexcrichton
alexcrichton enabled auto-merge (squash) September 9, 2026 15:15
@alexcrichton
alexcrichton merged commit 9847e1b into bytecodealliance:release-49.0.0 Sep 9, 2026
197 checks passed
@alexcrichton
alexcrichton deleted the backports branch September 9, 2026 15:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants