Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[EH] Test StackIR's local2stack on translator output #6264

Merged
merged 1 commit into from
Feb 1, 2024

Conversation

aheejin
Copy link
Member

@aheejin aheejin commented Feb 1, 2024

This adds STACKIR-OPT filecheck lines to translate-to-new-eh.wast to see if StackIR's local2stack optimization successfully removes some of unnecessary local.set/local.gets.

While supporting the whole Binayren optimization pipeline for the new EH instructions is not the goal for the very near-term future, StackIR's local2stack optimization can help with a very common pattern generated by this translator, which is:

(try $l
  (do ... )
  (catch_all
    (call $destructor)
    (rethrow $l)
  )
)

is translated to

(block $outer
  (local.set $exn     ;; can be optimized away
    (block $catch_all (result exnref)
      (try_table (catch_all_ref $catch_all)
        ...
      )
      (br $outer)
    )
  )
  (call $destructor)
  (throw_ref
    (local.get $exn)  ;; can be optimized away
  )
)

Here we don't really need local.set $exn and local.get $exn, and these can be optimized away using StackIR's local2stack. After optimizing them away in Stack IR, the code can be like

block $outer
  block $catch_all (result exnref)
    try_table (catch_all_ref $catch_all)
      ...
    end
    br $outer
  end
  call $destructor
  throw_ref
end

This optimization alone reduces the code size increased caused by translating significantly. For Adobe Photoshop, the code size increase goes down from 4.2% to 2.8%, and for Binaryen, it goes down from 3.8% to 2.0%.

This addes `STACKIR-OPT` filecheck lines to `translate-to-new-eh.wast`
to see if StackIR's `local2stack` optimization successfully removes some
of unnecessary `local.set`/`local.get`s.

While supporting the whole Binayren optimization pipeline for the new EH
instructions is not the goal for the very near-term future, StackIR's
`local2stack` optimization can help with a very common pattern generated
by this translator, which is:
```wast
(try $l
  (do ... )
  (catch_all
    (call $destructor)
    (rethrow $l)
  )
)
```
is translated to
```
(block $outer
  (local.set $exn     ;; can be optimized away
    (block $catch_all (result exnref)
      (try_table (catch_all_ref $catch_all)
        ...
      )
      (br $outer)
    )
  )
  (call $destructor)
  (throw_ref
    (local.get $exn)  ;; can be optimized away
  )
)
```

Here we don't really need `local.set $exn` and `local.get $exn`, and
these can be optimized away using StackIR's local2stack. After
optimizing them away in Stack IR, the code can be like
```wast
block $outer
  block $catch_all (result exnref)
    try_table (catch_all_ref $catch_all)
      ...
    end
    br $outer
  end
  call $destructor
  throw_ref
```

This optimization alone reduces the code size increased caused by
translating significantly. For Adobe Photoshop, the code size increase
goes down from 4.2% to 2.8%, and for Binaryen, it goes down from 3.8% to
2.0%.
@aheejin aheejin requested review from kripken and tlively February 1, 2024 00:47
;; STACKIR-OPT-NEXT: end
;; STACKIR-OPT-NEXT: throw_ref
;; STACKIR-OPT-NEXT: end
;; STACKIR-OPT-NEXT: )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looks like this is an example of those local.set/get operations getting removed.

@aheejin aheejin merged commit 19fb1f4 into WebAssembly:main Feb 1, 2024
13 checks passed
@aheejin aheejin deleted the eh_translator_stackir_opt_test branch February 1, 2024 01:17
radekdoulik pushed a commit to dotnet/binaryen that referenced this pull request Jul 12, 2024
This adds `STACKIR-OPT` filecheck lines to `translate-to-new-eh.wast`
to see if StackIR's `local2stack` optimization successfully removes some
of unnecessary `local.set`/`local.get`s.

While supporting the whole Binayren optimization pipeline for the new EH
instructions is not the goal for the very near-term future, StackIR's
`local2stack` optimization can help with a very common pattern generated
by this translator, which is:
```wast
(try $l
  (do ... )
  (catch_all
    (call $destructor)
    (rethrow $l)
  )
)
```
is translated to
```wast
(block $outer
  (local.set $exn     ;; can be optimized away
    (block $catch_all (result exnref)
      (try_table (catch_all_ref $catch_all)
        ...
      )
      (br $outer)
    )
  )
  (call $destructor)
  (throw_ref
    (local.get $exn)  ;; can be optimized away
  )
)
```

Here we don't really need `local.set $exn` and `local.get $exn`, and
these can be optimized away using StackIR's local2stack. After
optimizing them away in Stack IR, the code can be like
```wast
block $outer
  block $catch_all (result exnref)
    try_table (catch_all_ref $catch_all)
      ...
    end
    br $outer
  end
  call $destructor
  throw_ref
end
```

This optimization alone reduces the code size increased caused by
translating significantly. For Adobe Photoshop, the code size increase
goes down from 4.2% to 2.8%, and for Binaryen, it goes down from 3.8% to
2.0%.
@gkdn gkdn mentioned this pull request Aug 31, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants