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

RemoveUnusedBrs fails to optimize control flow based dead code

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

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

評価

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

調査の方向性

RemoveUnusedBrs 最適化から始め、wasm-opt バージョン 2b989ae を O2 と O3 で使用して、提供された WebAssembly ケースを再現します。結果の制御フローを期待される O2 の出力と比較します。O3 でも、示されているように到達不能な分岐本体とそれに続く dead call が削除されれば完了です。

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

説明

Given the following code:

(module
  (import "env" "dead" (func $dead))
  (func $_start (param $0 i32)
    i32.const 0
    i32.const 0
    call $main)
  (func $main (param $0 i32) (param $1 i32)
    block  ;; label = @1
      i32.const 0
      i32.const 0
      i32.store
      i32.const 0
      i32.load
      local.set $1
      i32.const 1
      local.set $0
      local.get $1
      br_if 0 (;@1;)
      i32.const 0
      i32.const 0
      i32.store
      i32.const 1
      local.set $0
      local.get $0
      br_if 0 (;@1;)
      i32.const 0
      local.set $0
    end
    local.get $0
    if  ;; label = @1
      unreachable
    end
    call $dead
    call $dead
    call $dead
    )
  (memory 1)
  (export "_start" (func $_start)))

wasm-opt version: 2b989ae

O2 can eliminate the dead code because it identifies the statements of if unreachable:

 (func $_start (param $0 i32)
  (i32.store
   (i32.const 0)
   (i32.const 0)
  )
  (if
   (i32.eqz
    (i32.load
     (i32.const 0)
    )
   )
   (then
    (i32.store
     (i32.const 0)
     (i32.const 0)
    )
   )
  )
  (unreachable)
 )

O3 cannot:

 (func $_start (param $0 i32)
  (if
   (block $block (result i32)
    (i32.store
     (i32.const 0)
     (i32.const 0)
    )
    (drop
     (br_if $block
      (i32.const 1)
      (i32.load
       (i32.const 0)
      )
     )
    )
    (i32.store
     (i32.const 0)
     (i32.const 0)
    )
    (i32.const 1)
   )
   (then
    (unreachable)
   )
  )
  (call $dead)
  (call $dead)
  (call $dead)
 )
主要言語
WebAssembly
スター
8.6k
フォーク
885
平均マージ
2日 4時間
マージ済み PR(30日)
77

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

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

WebAssembly/binaryen のほかの issue

WebAssembly/binaryen の issue をすべて見る

似ている issue

Compilers の issue をもっと見る

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

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