diff options
| author | Thomas Lively <tlively@google.com> | 2019-10-15 01:11:51 +0000 |
|---|---|---|
| committer | Thomas Lively <tlively@google.com> | 2019-10-15 01:11:51 +0000 |
| commit | 232fd99d9ee6d852b44d1cf5f491b00e4241d7ea (patch) | |
| tree | 9fec997f2ba1e5a975a8b7c125ef85ea74b08b99 /llvm/test/CodeGen/WebAssembly | |
| parent | 6f0768f64da398d5103d39e83bdc66a5ffd6f0f6 (diff) | |
| download | bcm5719-llvm-232fd99d9ee6d852b44d1cf5f491b00e4241d7ea.tar.gz bcm5719-llvm-232fd99d9ee6d852b44d1cf5f491b00e4241d7ea.zip | |
[WebAssembly] Trapping fptoint builtins and intrinsics
Summary:
The WebAssembly backend lowers fptoint instructions to a code sequence
that checks for overflow to avoid traps because fptoint is supposed to
be speculatable. These new builtins and intrinsics give users a way to
depend on the trapping semantics of the underlying instructions and
avoid the extra code generated normally.
Patch by coffee and tlively.
Reviewers: aheejin
Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, cfe-commits, llvm-commits
Tags: #clang, #llvm
Differential Revision: https://reviews.llvm.org/D68902
llvm-svn: 374856
Diffstat (limited to 'llvm/test/CodeGen/WebAssembly')
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/conv-trap.ll | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/conv-trap.ll b/llvm/test/CodeGen/WebAssembly/conv-trap.ll index eff10ff9ca0..67519ee68fd 100644 --- a/llvm/test/CodeGen/WebAssembly/conv-trap.ll +++ b/llvm/test/CodeGen/WebAssembly/conv-trap.ll @@ -165,3 +165,83 @@ define i64 @i64_trunc_u_f64(double %x) { %a = fptoui double %x to i64 ret i64 %a } + +; CHECK-LABEL: llvm_wasm_trunc_signed_i32_f32: +; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i32_f32 (f32) -> (i32) +; CHECK-NEXT: i32.trunc_f32_s $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i32 @llvm.wasm.trunc.signed.i32.f32(float) +define i32 @llvm_wasm_trunc_signed_i32_f32(float %f) { + %a = call i32 @llvm.wasm.trunc.signed.i32.f32(float %f) + ret i32 %a +} + +; CHECK-LABEL: llvm_wasm_trunc_unsigned_i32_f32: +; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i32_f32 (f32) -> (i32) +; CHECK-NEXT: i32.trunc_f32_u $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i32 @llvm.wasm.trunc.unsigned.i32.f32(float) +define i32 @llvm_wasm_trunc_unsigned_i32_f32(float %f) { + %a = call i32 @llvm.wasm.trunc.unsigned.i32.f32(float %f) + ret i32 %a +} + +; CHECK-LABEL: llvm_wasm_trunc_signed_i32_f64: +; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i32_f64 (f64) -> (i32) +; CHECK-NEXT: i32.trunc_f64_s $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i32 @llvm.wasm.trunc.signed.i32.f64(double) +define i32 @llvm_wasm_trunc_signed_i32_f64(double %f) { + %a = call i32 @llvm.wasm.trunc.signed.i32.f64(double %f) + ret i32 %a +} + +; CHECK-LABEL: llvm_wasm_trunc_unsigned_i32_f64: +; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i32_f64 (f64) -> (i32) +; CHECK-NEXT: i32.trunc_f64_u $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i32 @llvm.wasm.trunc.unsigned.i32.f64(double) +define i32 @llvm_wasm_trunc_unsigned_i32_f64(double %f) { + %a = call i32 @llvm.wasm.trunc.unsigned.i32.f64(double %f) + ret i32 %a +} + +; CHECK-LABEL: llvm_wasm_trunc_signed_i64_f32: +; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i64_f32 (f32) -> (i64) +; CHECK-NEXT: i64.trunc_f32_s $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i64 @llvm.wasm.trunc.signed.i64.f32(float) +define i64 @llvm_wasm_trunc_signed_i64_f32(float %f) { + %a = call i64 @llvm.wasm.trunc.signed.i64.f32(float %f) + ret i64 %a +} + +; CHECK-LABEL: llvm_wasm_trunc_unsigned_i64_f32: +; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i64_f32 (f32) -> (i64) +; CHECK-NEXT: i64.trunc_f32_u $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i64 @llvm.wasm.trunc.unsigned.i64.f32(float) +define i64 @llvm_wasm_trunc_unsigned_i64_f32(float %f) { + %a = call i64 @llvm.wasm.trunc.unsigned.i64.f32(float %f) + ret i64 %a +} + +; CHECK-LABEL: llvm_wasm_trunc_signed_i64_f64: +; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i64_f64 (f64) -> (i64) +; CHECK-NEXT: i64.trunc_f64_s $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i64 @llvm.wasm.trunc.signed.i64.f64(double) +define i64 @llvm_wasm_trunc_signed_i64_f64(double %f) { + %a = call i64 @llvm.wasm.trunc.signed.i64.f64(double %f) + ret i64 %a +} + +; CHECK-LABEL: llvm_wasm_trunc_unsigned_i64_f64: +; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i64_f64 (f64) -> (i64) +; CHECK-NEXT: i64.trunc_f64_u $push[[L0:[0-9]+]]=, $0{{$}} +; CHECK-NEXT: return $pop[[L0]]{{$}} +declare i64 @llvm.wasm.trunc.unsigned.i64.f64(double) +define i64 @llvm_wasm_trunc_unsigned_i64_f64(double %f) { + %a = call i64 @llvm.wasm.trunc.unsigned.i64.f64(double %f) + ret i64 %a +} |

