RemoveUnusedBrs causes ineffective code
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 停滞
- 技術スタック
- wasm
- 領域
- compilers
調査の方向性
提供された WebAssembly を使って wasm-opt c91c052 で問題を再現し、-O3 と -O3 -sp=remove-unused-brs を比較します。RemoveUnusedBrs パスから始めて、それが制御フローをどのように変換するかを追跡します。オプティマイザが報告された無効な結果を生成しなくなり、回帰テストのカバレッジが期待される動作を維持すれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Given the following code:
(module
(import "External" "external_function" (func $external_function))
(func $_start (param $0 i32) (param $1 i32)
(local $2 i32) (local $3 i32)
i32.const 587
i32.load8_u
local.set $0
i32.const 24
local.set $1
local.get $0
local.get $1
i32.shl
local.get $1
i32.shr_s
local.set $0
i32.const 587
i32.load8_u
local.set $1
i32.const 24
local.set $2
local.get $1
local.get $2
i32.shl
local.get $2
i32.shr_s
local.set $1
i32.const 587
i32.load8_u
local.set $2
i32.const 24
local.set $3
local.get $2
local.get $3
i32.shl
local.get $3
i32.shr_s
local.set $2
local.get $1
local.get $2
i32.ge_s
local.set $1
block ;; label = @1
local.get $1
br_if 0 (;@1;)
call $external_function
end
local.get $0
i32.const 0
call $foo
drop
unreachable)
(func $foo (param $0 i32) (param $1 i32) (result i32)
unreachable)
(memory $0 258 258)
(export "_start" (func $_start)))
For wasm-opt (c91c052), -O3 -sp=remove-unused-brs produces:
(func $_start (param $0 i32) (param $1 i32)
(drop
(i32.load8_u
(i32.const 587)
)
)
(unreachable)
)
while -O3 produces counter-intuitive code:
(func $_start (param $0 i32) (param $1 i32)
(if
(i32.lt_s
(local.tee $1
(i32.extend8_s
(i32.load8_s
(i32.const 587)
)
)
)
(local.get $1)
)
(then
(call $external_function)
)
)
(unreachable)
)
The RemoveUnusedBrs takes lots efforts to optimize the control flow. However, it causes poor code, which defies our expectations.
- 主要言語
- WebAssembly
- スター
- 8.6k
- フォーク
- 885
- 平均マージ
- 2日 1時間
- マージ済み PR(30日)
- 70
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
WebAssembly/binaryen のほかの issue
-
難易度 2/5 半日 初心者へのやさしさ 76/100
WebAssembly/binaryen#9018 · コメント 3 件 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 52/100
WebAssembly/binaryen#9123 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
WebAssembly/binaryen#9122 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
WebAssembly/binaryen#9086 · コメント 2 件 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
WebAssembly/binaryen#9038 · コメント 5 件 ·
WebAssembly/binaryen の issue をすべて見る
似ている issue
-
compiler/runtime
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
objectionary/eo#8869 · コメント 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
EricSpencer00/Resilient#4824 · コメント 1 件 ·
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
objectionary/jeo-maven-plugin#1758 ·
-
generics
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100