summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2020-06-03 06:41:55 -0700
committerGitHub <noreply@github.com>2020-06-03 06:41:55 -0700
commit0dff178cb4467b07d7bd58713e80b46d15601757 (patch)
treea9ceee118b439defe3ae26c7c37e0dfab44519a1 /test
parent501b0a08fafd2b4d2fbb5dd6a4320641bfc823b1 (diff)
downloadbinaryen-0dff178cb4467b07d7bd58713e80b46d15601757.tar.gz
binaryen-0dff178cb4467b07d7bd58713e80b46d15601757.tar.bz2
binaryen-0dff178cb4467b07d7bd58713e80b46d15601757.zip
DeNaN improvements (#2888)
Instead of instrumenting every local.get, instrument parameters on arrival at a function once on entry. After that, every local will always contain a de-naned value (since we would denan on a local.set). This is more efficient and also less confusing I think. Also avoid doing anything to values that fall through as they have already been fixed up.
Diffstat (limited to 'test')
-rw-r--r--test/passes/denan.txt123
-rw-r--r--test/passes/denan.wast27
2 files changed, 145 insertions, 5 deletions
diff --git a/test/passes/denan.txt b/test/passes/denan.txt
index 67f4989e4..10794b03b 100644
--- a/test/passes/denan.txt
+++ b/test/passes/denan.txt
@@ -1,26 +1,139 @@
(module
(type $f32_=>_f32 (func (param f32) (result f32)))
(type $f64_=>_f64 (func (param f64) (result f64)))
+ (type $i32_f32_i64_f64_=>_none (func (param i32 f32 i64 f64)))
+ (type $f32_f64_=>_none (func (param f32 f64)))
(global $global$1 (mut f32) (f32.const 0))
(global $global$2 (mut f32) (f32.const 12.34000015258789))
(func $foo32 (param $x f32) (result f32)
+ (local.set $x
+ (call $deNan32
+ (local.get $x)
+ )
+ )
(call $deNan32
(call $foo32
- (call $deNan32
- (local.get $x)
- )
+ (local.get $x)
)
)
)
(func $foo64 (param $x f64) (result f64)
+ (local.set $x
+ (call $deNan64
+ (local.get $x)
+ )
+ )
(call $deNan64
(call $foo64
- (call $deNan64
- (local.get $x)
+ (local.get $x)
+ )
+ )
+ )
+ (func $various (param $x i32) (param $y f32) (param $z i64) (param $w f64)
+ (local.set $y
+ (call $deNan32
+ (local.get $y)
+ )
+ )
+ (local.set $w
+ (call $deNan64
+ (local.get $w)
+ )
+ )
+ (nop)
+ )
+ (func $ignore-local.get (param $f f32) (param $d f64)
+ (local.set $f
+ (call $deNan32
+ (local.get $f)
+ )
+ )
+ (local.set $d
+ (call $deNan64
+ (local.get $d)
+ )
+ )
+ (drop
+ (local.get $f)
+ )
+ (drop
+ (local.get $d)
+ )
+ (local.set $f
+ (local.get $f)
+ )
+ (local.set $d
+ (local.get $d)
+ )
+ (drop
+ (local.get $f)
+ )
+ (drop
+ (local.get $d)
+ )
+ (drop
+ (call $deNan32
+ (f32.abs
+ (local.get $f)
+ )
+ )
+ )
+ (drop
+ (call $deNan64
+ (f64.abs
+ (local.get $d)
+ )
+ )
+ )
+ (local.set $f
+ (call $deNan32
+ (f32.abs
+ (local.get $f)
+ )
+ )
+ )
+ (local.set $d
+ (call $deNan64
+ (f64.abs
+ (local.get $d)
+ )
+ )
+ )
+ (drop
+ (local.get $f)
+ )
+ (drop
+ (local.get $d)
+ )
+ )
+ (func $tees (param $x f32) (result f32)
+ (local.set $x
+ (call $deNan32
+ (local.get $x)
+ )
+ )
+ (local.tee $x
+ (local.tee $x
+ (local.tee $x
+ (local.tee $x
+ (local.get $x)
+ )
)
)
)
)
+ (func $select (param $x f32) (result f32)
+ (local.set $x
+ (call $deNan32
+ (local.get $x)
+ )
+ )
+ (select
+ (local.get $x)
+ (local.get $x)
+ (i32.const 1)
+ )
+ )
(func $deNan32 (param $0 f32) (result f32)
(if (result f32)
(f32.eq
diff --git a/test/passes/denan.wast b/test/passes/denan.wast
index 73c3c8f1c..7ab0964b2 100644
--- a/test/passes/denan.wast
+++ b/test/passes/denan.wast
@@ -7,4 +7,31 @@
(func $foo64 (param $x f64) (result f64)
(call $foo64 (local.get $x))
)
+ (func $various (param $x i32) (param $y f32) (param $z i64) (param $w f64)
+ )
+ (func $ignore-local.get (param $f f32) (param $d f64)
+ (drop (local.get $f))
+ (drop (local.get $d))
+ (local.set $f (local.get $f))
+ (local.set $d (local.get $d))
+ (drop (local.get $f))
+ (drop (local.get $d))
+ (drop (f32.abs (local.get $f)))
+ (drop (f64.abs (local.get $d)))
+ (local.set $f (f32.abs (local.get $f)))
+ (local.set $d (f64.abs (local.get $d)))
+ (drop (local.get $f))
+ (drop (local.get $d))
+ )
+ (func $tees (param $x f32) (result f32)
+ (local.tee $x
+ (local.tee $x
+ (local.tee $x
+ (local.tee $x
+ (local.get $x))))))
+ (func $select (param $x f32) (result f32)
+ (select
+ (local.get $x)
+ (local.get $x)
+ (i32.const 1)))
)