summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-07-15 13:19:23 -0700
committerGitHub <noreply@github.com>2016-07-15 13:19:23 -0700
commit184cc11cee2a65d30c7696eb3284e132099e4acb (patch)
treece8feb8cbcdc7b732aa7148bff92a5f5e77cf6c7
parent8364330269151591f435ea0328aeee1c34decf79 (diff)
downloadbinaryen-184cc11cee2a65d30c7696eb3284e132099e4acb.tar.gz
binaryen-184cc11cee2a65d30c7696eb3284e132099e4acb.tar.bz2
binaryen-184cc11cee2a65d30c7696eb3284e132099e4acb.zip
eq/ne are ok to optimize even if they are nans (#640)
-rw-r--r--src/passes/OptimizeInstructions.wast16
-rw-r--r--src/passes/OptimizeInstructions.wast.processed16
-rw-r--r--test/emcc_hello_world.fromasm30
-rw-r--r--test/emcc_hello_world.fromasm.imprecise30
-rw-r--r--test/passes/optimize-instructions.txt16
-rw-r--r--test/passes/optimize-instructions.wast5
6 files changed, 79 insertions, 34 deletions
diff --git a/src/passes/OptimizeInstructions.wast b/src/passes/OptimizeInstructions.wast
index 616341a83..7d5c56881 100644
--- a/src/passes/OptimizeInstructions.wast
+++ b/src/passes/OptimizeInstructions.wast
@@ -115,6 +115,22 @@
(i32.eqz (i64.ge_u (call_import $i64.expr (i32.const 0)) (call_import $i64.expr (i32.const 1))))
(i64.lt_u (call_import $i64.expr (i32.const 0)) (call_import $i64.expr (i32.const 1)))
)
+ (block
+ (i32.eqz (f32.eq (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1))))
+ (f32.ne (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1)))
+ )
+ (block
+ (i32.eqz (f32.ne (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1))))
+ (f32.eq (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1)))
+ )
+ (block
+ (i32.eqz (f64.eq (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1))))
+ (f64.ne (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1)))
+ )
+ (block
+ (i32.eqz (f64.ne (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1))))
+ (f64.eq (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1)))
+ )
)
)
diff --git a/src/passes/OptimizeInstructions.wast.processed b/src/passes/OptimizeInstructions.wast.processed
index c6f6de0fd..61fde86c6 100644
--- a/src/passes/OptimizeInstructions.wast.processed
+++ b/src/passes/OptimizeInstructions.wast.processed
@@ -115,6 +115,22 @@
"(i32.eqz (i64.ge_u (call_import $i64.expr (i32.const 0)) (call_import $i64.expr (i32.const 1))))\n"
"(i64.lt_u (call_import $i64.expr (i32.const 0)) (call_import $i64.expr (i32.const 1)))\n"
")\n"
+"(block\n"
+"(i32.eqz (f32.eq (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1))))\n"
+"(f32.ne (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1)))\n"
+")\n"
+"(block\n"
+"(i32.eqz (f32.ne (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1))))\n"
+"(f32.eq (call_import $f32.expr (i32.const 0)) (call_import $f32.expr (i32.const 1)))\n"
+")\n"
+"(block\n"
+"(i32.eqz (f64.eq (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1))))\n"
+"(f64.ne (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1)))\n"
+")\n"
+"(block\n"
+"(i32.eqz (f64.ne (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1))))\n"
+"(f64.eq (call_import $f64.expr (i32.const 0)) (call_import $f64.expr (i32.const 1)))\n"
+")\n"
")\n"
")\n"
"\n"
diff --git a/test/emcc_hello_world.fromasm b/test/emcc_hello_world.fromasm
index c85852a3f..93932a33f 100644
--- a/test/emcc_hello_world.fromasm
+++ b/test/emcc_hello_world.fromasm
@@ -5835,21 +5835,19 @@
)
)
(if
- (i32.eqz
- (f64.ne
- (set_local $14
- (f64.mul
- (f64.sub
- (get_local $14)
- (f64.convert_u/i32
- (get_local $5)
- )
+ (f64.eq
+ (set_local $14
+ (f64.mul
+ (f64.sub
+ (get_local $14)
+ (f64.convert_u/i32
+ (get_local $5)
)
- (f64.const 1e9)
)
+ (f64.const 1e9)
)
- (f64.const 0)
)
+ (f64.const 0)
)
(block
(set_local $7
@@ -6651,14 +6649,12 @@
)
)
(if
- (i32.eqz
- (f64.ne
- (f64.add
- (get_local $14)
- (get_local $29)
- )
+ (f64.eq
+ (f64.add
(get_local $14)
+ (get_local $29)
)
+ (get_local $14)
)
(block
(set_local $5
diff --git a/test/emcc_hello_world.fromasm.imprecise b/test/emcc_hello_world.fromasm.imprecise
index 08f647aed..cdfd59b07 100644
--- a/test/emcc_hello_world.fromasm.imprecise
+++ b/test/emcc_hello_world.fromasm.imprecise
@@ -5829,21 +5829,19 @@
)
)
(if
- (i32.eqz
- (f64.ne
- (set_local $14
- (f64.mul
- (f64.sub
- (get_local $14)
- (f64.convert_u/i32
- (get_local $5)
- )
+ (f64.eq
+ (set_local $14
+ (f64.mul
+ (f64.sub
+ (get_local $14)
+ (f64.convert_u/i32
+ (get_local $5)
)
- (f64.const 1e9)
)
+ (f64.const 1e9)
)
- (f64.const 0)
)
+ (f64.const 0)
)
(block
(set_local $7
@@ -6645,14 +6643,12 @@
)
)
(if
- (i32.eqz
- (f64.ne
- (f64.add
- (get_local $14)
- (get_local $29)
- )
+ (f64.eq
+ (f64.add
(get_local $14)
+ (get_local $29)
)
+ (get_local $14)
)
(block
(set_local $5
diff --git a/test/passes/optimize-instructions.txt b/test/passes/optimize-instructions.txt
index bad6c5f6f..fc74041a9 100644
--- a/test/passes/optimize-instructions.txt
+++ b/test/passes/optimize-instructions.txt
@@ -99,5 +99,21 @@
(f64.const 2)
)
)
+ (f32.ne
+ (f32.const 1)
+ (f32.const 2)
+ )
+ (f32.eq
+ (f32.const 1)
+ (f32.const 2)
+ )
+ (f64.ne
+ (f64.const 1)
+ (f64.const 2)
+ )
+ (f64.eq
+ (f64.const 1)
+ (f64.const 2)
+ )
)
)
diff --git a/test/passes/optimize-instructions.wast b/test/passes/optimize-instructions.wast
index 614d59b11..bea01bd1c 100644
--- a/test/passes/optimize-instructions.wast
+++ b/test/passes/optimize-instructions.wast
@@ -38,6 +38,11 @@
(i32.eqz (f64.ge (f64.const 1) (f64.const 2)))
(i32.eqz (f64.lt (f64.const 1) (f64.const 2)))
(i32.eqz (f64.le (f64.const 1) (f64.const 2)))
+
+ (i32.eqz (f32.eq (f32.const 1) (f32.const 2)))
+ (i32.eqz (f32.ne (f32.const 1) (f32.const 2)))
+ (i32.eqz (f64.eq (f64.const 1) (f64.const 2)))
+ (i32.eqz (f64.ne (f64.const 1) (f64.const 2)))
)
)