diff options
author | Dan Gohman <dan433584@gmail.com> | 2017-11-29 20:20:11 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2017-11-29 20:20:11 +0000 |
commit | 685c102164544ca0d08ac37f049fef441ab64d07 (patch) | |
tree | 65fc6701946309bbab35c8a11300a243c4b8eba8 /test/CodeGen/WebAssembly | |
parent | 9bb51631d15db744e06d72b1da3525cd3adb0b23 (diff) |
[WebAssembly] Fix fptoui lowering bounds
To fully avoid trapping on wasm, fptoui needs a second check to ensure that
the operand isn't below the supported range.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319354 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/WebAssembly')
-rw-r--r-- | test/CodeGen/WebAssembly/conv-trap.ll | 100 |
1 files changed, 52 insertions, 48 deletions
diff --git a/test/CodeGen/WebAssembly/conv-trap.ll b/test/CodeGen/WebAssembly/conv-trap.ll index 160d893d74c..e20ed0a4527 100644 --- a/test/CodeGen/WebAssembly/conv-trap.ll +++ b/test/CodeGen/WebAssembly/conv-trap.ll @@ -13,14 +13,13 @@ target triple = "wasm32-unknown-unknown-wasm" ; CHECK-NEXT: f32.abs $push[[ABS:[0-9]+]]=, $0{{$}} ; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p31{{$}} ; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i32.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: br_if 0, $pop[[LT]]{{$}} ; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, -2147483648{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i32.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i32 @i32_trunc_s_f32(float %x) { %a = fptosi float %x to i32 ret i32 %a @@ -32,14 +31,16 @@ define i32 @i32_trunc_s_f32(float %x) { ; CHECK-NEXT: block ; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p32{{$}} ; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i32.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: f32.const $push[[ZERO:[0-9]+]]=, 0x0p0{{$}} +; CHECK-NEXT: f32.ge $push[[GE:[0-9]+]]=, $0, $pop[[ZERO]]{{$}} +; CHECK-NEXT: i32.and $push[[AND:[0-9]+]]=, $pop[[LT]], $pop[[GE]]{{$}} +; CHECK-NEXT: br_if 0, $pop[[AND]]{{$}} ; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, 0{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i32.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i32 @i32_trunc_u_f32(float %x) { %a = fptoui float %x to i32 ret i32 %a @@ -52,14 +53,13 @@ define i32 @i32_trunc_u_f32(float %x) { ; CHECK-NEXT: f64.abs $push[[ABS:[0-9]+]]=, $0{{$}} ; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p31{{$}} ; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i32.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: br_if 0, $pop[[LT]]{{$}} ; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, -2147483648{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i32.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i32 @i32_trunc_s_f64(double %x) { %a = fptosi double %x to i32 ret i32 %a @@ -71,14 +71,16 @@ define i32 @i32_trunc_s_f64(double %x) { ; CHECK-NEXT: block ; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p32{{$}} ; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i32.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: f64.const $push[[ZERO:[0-9]+]]=, 0x0p0{{$}} +; CHECK-NEXT: f64.ge $push[[GE:[0-9]+]]=, $0, $pop[[ZERO]]{{$}} +; CHECK-NEXT: i32.and $push[[AND:[0-9]+]]=, $pop[[LT]], $pop[[GE]]{{$}} +; CHECK-NEXT: br_if 0, $pop[[AND]]{{$}} ; CHECK-NEXT: i32.const $push[[ALT:[0-9]+]]=, 0{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i32.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i32 @i32_trunc_u_f64(double %x) { %a = fptoui double %x to i32 ret i32 %a @@ -91,14 +93,13 @@ define i32 @i32_trunc_u_f64(double %x) { ; CHECK-NEXT: f32.abs $push[[ABS:[0-9]+]]=, $0{{$}} ; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p63{{$}} ; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i64.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: br_if 0, $pop[[LT]]{{$}} ; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, -9223372036854775808{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i64.trunc_s/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i64 @i64_trunc_s_f32(float %x) { %a = fptosi float %x to i64 ret i64 %a @@ -110,14 +111,16 @@ define i64 @i64_trunc_s_f32(float %x) { ; CHECK-NEXT: block ; CHECK-NEXT: f32.const $push[[LIMIT:[0-9]+]]=, 0x1p64{{$}} ; CHECK-NEXT: f32.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i64.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: f32.const $push[[ZERO:[0-9]+]]=, 0x0p0{{$}} +; CHECK-NEXT: f32.ge $push[[GE:[0-9]+]]=, $0, $pop[[ZERO]]{{$}} +; CHECK-NEXT: i32.and $push[[AND:[0-9]+]]=, $pop[[LT]], $pop[[GE]]{{$}} +; CHECK-NEXT: br_if 0, $pop[[AND]]{{$}} ; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, 0{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i64.trunc_u/f32 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i64 @i64_trunc_u_f32(float %x) { %a = fptoui float %x to i64 ret i64 %a @@ -130,14 +133,13 @@ define i64 @i64_trunc_u_f32(float %x) { ; CHECK-NEXT: f64.abs $push[[ABS:[0-9]+]]=, $0{{$}} ; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p63{{$}} ; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $pop[[ABS]], $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i64.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: br_if 0, $pop[[LT]]{{$}} ; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, -9223372036854775808{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i64.trunc_s/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i64 @i64_trunc_s_f64(double %x) { %a = fptosi double %x to i64 ret i64 %a @@ -149,14 +151,16 @@ define i64 @i64_trunc_s_f64(double %x) { ; CHECK-NEXT: block ; CHECK-NEXT: f64.const $push[[LIMIT:[0-9]+]]=, 0x1p64{{$}} ; CHECK-NEXT: f64.lt $push[[LT:[0-9]+]]=, $0, $pop[[LIMIT]]{{$}} -; CHECK-NEXT: i32.eqz $push[[EQZ:[0-9]+]]=, $pop[[LT]]{{$}} -; CHECK-NEXT: br_if 0, $pop[[EQZ]]{{$}} -; CHECK-NEXT: i64.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}} -; CHECK-NEXT: return $pop[[NUM]]{{$}} -; CHECK-NEXT: BB -; CHECK-NEXT: end_block +; CHECK-NEXT: f64.const $push[[ZERO:[0-9]+]]=, 0x0p0{{$}} +; CHECK-NEXT: f64.ge $push[[GE:[0-9]+]]=, $0, $pop[[ZERO]]{{$}} +; CHECK-NEXT: i32.and $push[[AND:[0-9]+]]=, $pop[[LT]], $pop[[GE]]{{$}} +; CHECK-NEXT: br_if 0, $pop[[AND]]{{$}} ; CHECK-NEXT: i64.const $push[[ALT:[0-9]+]]=, 0{{$}} ; CHECK-NEXT: return $pop[[ALT]]{{$}} +; CHECK-NEXT: BB +; CHECK-NEXT: end_block +; CHECK-NEXT: i64.trunc_u/f64 $push[[NUM:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} define i64 @i64_trunc_u_f64(double %x) { %a = fptoui double %x to i64 ret i64 %a |