Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Wasm-opt not deduplicating repeated struct.gets on unchanged local

オープン
#8,312 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
38/100
issue の種類
機能追加
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
wasm
領域
compilers

調査の方向性

wasm-opt から始め、issue に示された繰り返しの local.get/struct.get パターンを再現します。変更されていない locals に対する optimizer の動作を追跡し、繰り返される struct.gets を認識できる箇所を特定します。パターンが重複排除され、示されている制御フローが維持され、コードサイズまたはパフォーマンスへの影響が確認できれば完了です。

索引モデルが issue の本文から書いたものです。

説明

Consider the larger wasm snippet below. There are multiple instances of the same group of instructions:

local.get $var0
struct.get $#Top $field0

$var0 doesn't change between these struct.gets. I would expect wasm-opt to be able to identify this, do the lookup once and store it in a local prior to entering the block. This would save both code size and performance. We have some functions with hundreds of these patterns so the code size savings from this could be significant.

...
block $label1
  block $label0 (result (ref $#Top))
    local.get $var0
    br_on_non_null $label0
    local.get $var0
    global.get $C6307 SymbolConstant(#[]=)
    local.get $var4
    call $_typeArgumentsToList
    local.get $var3
    call $_positionalParametersToList
    local.get $var10
    call $_namedParametersToMap
    call $_Invocation.method
    call $NoSuchMethodError._throwWithInvocation
    unreachable
  end $label0
  local.tee $var0
  struct.get $#Top $field0
  i32.const 15
  i32.eq
  br_if $label1
  local.get $var0
  struct.get $#Top $field0
  i32.const 16
  i32.eq
  if
    local.get $var0
    ref.as_non_null
    local.get $var4
    local.get $var3
    global.get $C5979 WasmArray<Object>[0]
    call $__ConstMap&_HashFieldBase&MapMixin&_HashBase&_OperatorEqualsAndHashCode&_LinkedHashMapMixin&_MapCreateIndexMixin&_UnmodifiableMapMixin.[]= invocation type checker
    drop
    return
  end
  local.get $var0
  struct.get $#Top $field0
  i32.const 17
  i32.eq
  br_if $label1
  local.get $var0
  struct.get $#Top $field0
  i32.const 18
  i32.eq
  if
    local.get $var0
    ref.as_non_null
    local.get $var4
    local.get $var3
    global.get $C5979 WasmArray<Object>[0]
    i32.const 0
    call_indirect (param (ref $#Top) (ref $Array<_Type>) (ref $Array<Object?>) (ref $Array<Object?>)) (result (ref null $#Top)) $&
    drop
    return
  end
  local.get $var0
  struct.get $#Top $field0
  i32.const 51
  i32.eq
  if
    local.get $var0
    ref.as_non_null
    local.get $var4
    local.get $var3
    global.get $C5979 WasmArray<Object>[0]
    call $CrossappCacheStorage.[]= invocation type checker
    drop
    return
  end
...
主要言語
WebAssembly
スター
8.6k
フォーク
892
平均マージ
1日 18時間
マージ済み PR(30日)
79

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

WebAssembly/binaryen のほかの issue

WebAssembly/binaryen の issue をすべて見る

似ている issue

Compilers の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。