blob: 348ec8d5941aa8023f91fe67e1059a5b7e63fb63 [file]
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; Floating-point numbers are not optimized without fast-math, as NaN operations
;; do not follow the rules of logic and we might misoptimize them.
;; RUN: wasm-opt %s --constraint-analysis -all -S -o - | filecheck %s
;; RUN: wasm-opt %s --constraint-analysis --fast-math -all -S -o - | filecheck %s --check-prefix=FASTM
(module
;; CHECK: (func $float-zero (type $0)
;; CHECK-NEXT: (local $f f64)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (f64.eq
;; CHECK-NEXT: (local.get $f)
;; CHECK-NEXT: (local.get $f)
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; FASTM: (func $float-zero (type $0)
;; FASTM-NEXT: (local $f f64)
;; FASTM-NEXT: (if
;; FASTM-NEXT: (i32.const 1)
;; FASTM-NEXT: (then
;; FASTM-NEXT: (nop)
;; FASTM-NEXT: )
;; FASTM-NEXT: )
;; FASTM-NEXT: )
(func $float-zero
(local $f f64)
;; When fast-math is enabled, we can optimize f == f to 1, as NaNs are not
;; important.
(if
(f64.eq
(local.get $f)
(local.get $f)
)
(then
(nop)
)
)
)
;; CHECK: (func $float-negative-zero (type $0)
;; CHECK-NEXT: (local $f f64)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (f64.eq
;; CHECK-NEXT: (local.get $f)
;; CHECK-NEXT: (f64.const -0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (f64.eq
;; CHECK-NEXT: (local.get $f)
;; CHECK-NEXT: (f64.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (then
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; FASTM: (func $float-negative-zero (type $0)
;; FASTM-NEXT: (local $f f64)
;; FASTM-NEXT: (if
;; FASTM-NEXT: (i32.const 1)
;; FASTM-NEXT: (then
;; FASTM-NEXT: (nop)
;; FASTM-NEXT: )
;; FASTM-NEXT: )
;; FASTM-NEXT: (if
;; FASTM-NEXT: (i32.const 1)
;; FASTM-NEXT: (then
;; FASTM-NEXT: (nop)
;; FASTM-NEXT: )
;; FASTM-NEXT: )
;; FASTM-NEXT: )
(func $float-negative-zero
(local $f f64)
;; Negative zero is equal to zero, even though it has a different bit
;; pattern. Both conditions here should be optimized to 1 in fast-math
;; mode (but not otherwise).
(if
(f64.eq
(local.get $f)
(f64.const -0)
)
(then
(nop)
)
)
(if
(f64.eq
(local.get $f)
(f64.const 0)
)
(then
(nop)
)
)
)
;; CHECK: (func $float-ne-nan (type $1) (result i32)
;; CHECK-NEXT: (local $nan f64)
;; CHECK-NEXT: (local.set $nan
;; CHECK-NEXT: (f64.const nan:0x8000000000000)
;; CHECK-NEXT: )
;; CHECK-NEXT: (f64.ne
;; CHECK-NEXT: (local.get $nan)
;; CHECK-NEXT: (local.get $nan)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; FASTM: (func $float-ne-nan (type $1) (result i32)
;; FASTM-NEXT: (local $nan f64)
;; FASTM-NEXT: (local.set $nan
;; FASTM-NEXT: (f64.const nan:0x8000000000000)
;; FASTM-NEXT: )
;; FASTM-NEXT: (i32.const 0)
;; FASTM-NEXT: )
(func $float-ne-nan (result i32)
(local $nan f64)
(local.set $nan
(f64.const nan)
)
;; This should be 1: the number is a NaN, and NaN != NaN. However, we
;; misoptimize this to 0 in fast-math mode (which is fine, as that mode
;; ignores the possibility of NaNs). In normal mode we do not optimize,
;; avoiding a misoptimization.
(f64.ne
(local.get $nan)
(local.get $nan)
)
)
)