WebAssembly / WebAssembly/binaryen
LICM pass stopped working
Open
Nobody has claimed this yet.
- Dominant language
- WebAssembly
- Stars
- 8.6k
- Forks
- 885
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 69
Description
After some of this changes: #4059 or #4077 or #4076
LICM pass stopped working.
Here minimal example:
export function loop1(n: i32, ptr: usize): void {
let acc = 0;
for (let i = 0; i < n; i++) {
acc += load<i32>(ptr);
}
}
Unoptimized version (original):
(module
(type $i32_i32_=>_none (func (param i32 i32)))
(memory $0 0)
(export "loop1" (func $loop-test/loop1))
(export "memory" (memory $0))
(func $loop-test/loop1 (param $0 i32) (param $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
i32.const 0
local.set $2
i32.const 0
local.set $3
loop $for-loop|0
local.get $3
local.get $0
i32.lt_s
local.set $4
local.get $4
if
local.get $2
local.get $1
i32.load
i32.add
local.set $2
local.get $3
i32.const 1
i32.add
local.set $3
br $for-loop|0
end
end
)
)
Optimized:
(module
(type $i32_i32_=>_none (func (param i32 i32)))
(memory $0 0)
(export "loop1" (func $loop-test/loop1))
(export "memory" (memory $0))
(func $loop-test/loop1 (param $0 i32) (param $1 i32)
(local $2 i32)
(local $3 i32)
loop $for-loop|0
local.get $0
local.get $2
i32.gt_s
if
local.get $1
i32.load
local.get $3
i32.add
local.set $3
local.get $2
i32.const 1
i32.add
local.set $2
br $for-loop|0
end
end
)
)
Expected:
(module
(type $i32_i32_=>_none (func (param i32 i32)))
(memory $0 0)
(export "loop1" (func $module/loop1))
(export "memory" (memory $0))
(func $module/loop1 (param $0 i32) (param $1 i32)
(local $2 i32)
(local $3 i32)
local.get $1
i32.load
local.set $1
loop $for-loop|0
local.get $0
local.get $2
i32.gt_s
if
local.get $1
local.get $3
i32.add
local.set $3
local.get $2
i32.const 1
i32.add
local.set $2
br $for-loop|0
end
end
)
)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the minimal TypeScript loop example and compare its unoptimized and optimized WAT output, then inspect the LICM pass and the changes referenced in #4059, #4077, and #4076. Done means the load is safely hoisted before the loop and the optimized output matches the expected WAT behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript, wasm
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100