local-cse introduces side effects via local.tee, blocking DCE in O3
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 停滞
- 技術スタック
- wasm
- 領域
- compilers
調査の方向性
まず、提供された WebAssembly を使って issue の wasm-opt の動作を再現し、-all -O2 と -all -O3 を比較します。追加の local-cse パスとその local.tee 変換を追跡し、その後、最適化パイプラインの後に always-false br_if の本体が削除されることを確認します。
索引モデルが issue の本文から書いたものです。
説明
Given the following code:
(module
(type $0 (func))
(type $1 (func (param i32 i32) (result i32)))
(import "External" "external_function" (func $external_function (type $0)))
(func $_start (type $1) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32) (local $4 i32) (local $7 i32) (local $8 i32) (local $11 i32) (local $13 i32)
global.get $__stack_pointer
local.set $2
local.get $2
i64.const 0
i64.store offset=1752
i32.const 4058
local.set $4
local.get $2
local.get $4
i32.add
i32.const 1
i32.add
local.set $7
i32.const 4058
local.set $8
local.get $2
local.get $8
i32.add
i32.const 1
i32.add
local.set $11
local.get $7
local.get $11
i32.ne
local.set $13
block ;; label = @1
local.get $13
i32.eqz
br_if 0 (;@1;)
call $external_function
end
unreachable)
(memory $0 259 259)
(global $__stack_pointer (mut i32) (i32.const 0))
(export "_start" (func $_start)))
wasm-opt (862aeb9) eliminates the dead br_if body by -all -O2 but can not do that by -all -O3.
After analysis, O3 performs one more local-cse than O2, thus introducing local.tee (e.g., combining local.set + local.get). However, it also introduces side effect, which blocks constant propagation and then finally blocks DCE
Specifically, through local-cse, wasm-opt transforms the condition (always false) of br_if statements from
(i32.ne
(i32.add
(i32.add
(local.get $0)
(i32.const 4058)
)
(i32.const 1)
)
(i32.add
(i32.add
(local.get $0)
(i32.const 4058)
)
(i32.const 1)
)
)
to
(i32.ne
(local.tee $2
(i32.add
(i32.add
(local.get $0)
(i32.const 4058)
)
(i32.const 1)
)
)
(local.get $2)
)
thus blocking the constant propagation, leading to DCE missed optimization.
Overall, I think it is a missed optimization.
- 主要言語
- WebAssembly
- スター
- 8.6k
- フォーク
- 892
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 78
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
WebAssembly/binaryen のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
WebAssembly/binaryen#9185 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
WebAssembly/binaryen#9135 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 半日 初心者へのやさしさ 76/100
WebAssembly/binaryen#9018 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 52/100
WebAssembly/binaryen#9186 ·
メンテナーはふだん 1 日以内に返信
-
LoopInvariantCodeMotion: `struct.new` is hoisted out of a loop, so all iterations share one objectオープン
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
WebAssembly/binaryen#9184 ·
メンテナーはふだん 1 日以内に返信
WebAssembly/binaryen の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
todo:ticket
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
メンテナーはふだん 1 日以内に返信
-
bug good-title pdd
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
objectionary/eo#9061 ·
メンテナーはふだん 1 日以内に返信