diff options
| author | Max Graey <maxgraey@gmail.com> | 2021-07-22 00:10:48 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-21 14:10:48 -0700 |
| commit | ed97c68294a8d95c57972eae22906cc0bea1aae8 (patch) | |
| tree | 3b90c42bc96153b137a683e0edc6cf529b453f55 /src/ir/abstract.h | |
| parent | 1e79c53ec1ad3d80db3354f15919331fdfa7ed28 (diff) | |
| download | binaryen-ed97c68294a8d95c57972eae22906cc0bea1aae8.tar.gz binaryen-ed97c68294a8d95c57972eae22906cc0bea1aae8.tar.bz2 binaryen-ed97c68294a8d95c57972eae22906cc0bea1aae8.zip | |
[Optimize Instructions] Combine reinterprets, loads and stores (#4006)
Fixes #3973
Loads:
f32.reinterpret_i32(i32.load(x)) => f32.load(x)
f64.reinterpret_i64(i64.load(x)) => f64.load(x)
i32.reinterpret_f32(f32.load(x)) => i32.load(x)
i64.reinterpret_f64(f64.load(x)) => i64.load(x)
Stores:
f32.store(y, f32.reinterpret_i32(x)) => i32.store(y, x)
f64.store(y, f64.reinterpret_i64(x)) => i64.store(y, x)
i32.store(y, i32.reinterpret_f32(x)) => f32.store(y, x)
i64.store(y, i64.reinterpret_f64(x)) => f64.store(y, x)
Also optimize reinterprets that are undone:
i32.reinterpret_f32(f32.reinterpret_i32(x)) => x
i64.reinterpret_f64(f64.reinterpret_i64(x)) => x
f32.reinterpret_i32(i32.reinterpret_f32(x)) => x
f64.reinterpret_i64(i64.reinterpret_f64(x)) => x
Diffstat (limited to 'src/ir/abstract.h')
| -rw-r--r-- | src/ir/abstract.h | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/ir/abstract.h b/src/ir/abstract.h index e5dfd57e0..2308c47ba 100644 --- a/src/ir/abstract.h +++ b/src/ir/abstract.h @@ -67,6 +67,11 @@ inline bool hasAnyShift(BinaryOp op) { op == RotRInt64; } +inline bool hasAnyReinterpret(UnaryOp op) { + return op == ReinterpretInt32 || op == ReinterpretInt64 || + op == ReinterpretFloat32 || op == ReinterpretFloat64; +} + // Provide a wasm type and an abstract op and get the concrete one. For example, // you can provide i32 and Add and receive the specific opcode for a 32-bit // addition, AddInt32. If the op does not exist, it returns Invalid. |
