summaryrefslogtreecommitdiff
path: root/test/lit/passes/optimize-instructions.wast
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2022-08-29 18:22:01 +0300
committerGitHub <noreply@github.com>2022-08-29 08:22:01 -0700
commit7fb44812fa307a5924e5ada58b4015de6736cce3 (patch)
treefc8838b140979b25321bb62a8334a57e1cb96a99 /test/lit/passes/optimize-instructions.wast
parentfea999ea89f89947cb72a1846ed1743dbe935d09 (diff)
downloadbinaryen-7fb44812fa307a5924e5ada58b4015de6736cce3.tar.gz
binaryen-7fb44812fa307a5924e5ada58b4015de6736cce3.tar.bz2
binaryen-7fb44812fa307a5924e5ada58b4015de6736cce3.zip
[OptimizeInstruction] Reorder rules in optimizeSelect (#4984)
To unblock some optimizations. For example this: ```wat (select (i32.eqz (local.get $x)) (i32.const 0) (i32.eqz (local.get $y)) ) ``` Was previously optimized as: ```wat (i32.eqz (select (i32.const 1) (local.get $x) (local.get $y) ) ) ``` Because `optimizeSelect` applied `!x ? !y : 0 -> x ? 0 : !y` then `!(x ? 1 : y)`, blocking the next rules which could have folded this to `or` or `and`. After this PR the same example optimizes better: ```wat (i32.eqz (i32.or (local.get $x) (local.get $y) ) ) ```
Diffstat (limited to 'test/lit/passes/optimize-instructions.wast')
-rw-r--r--test/lit/passes/optimize-instructions.wast19
1 files changed, 19 insertions, 0 deletions
diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast
index 91e08e328..b7b6b810f 100644
--- a/test/lit/passes/optimize-instructions.wast
+++ b/test/lit/passes/optimize-instructions.wast
@@ -732,6 +732,25 @@
)
)
)
+ ;; CHECK: (func $select-and-eqz (param $x i32) (param $y i32) (result i32)
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (i32.or
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $select-and-eqz (param $x i32) (param $y i32) (result i32)
+ (select
+ (i32.eqz
+ (local.get $x)
+ )
+ (i32.const 0)
+ (i32.eqz
+ (local.get $y)
+ )
+ )
+ )
;; CHECK: (func $select-or-side-effects (param $x i32) (param $y i32) (result i32)
;; CHECK-NEXT: (i32.or
;; CHECK-NEXT: (i32.eq