diff options
| author | Thomas Lively <tlively@google.com> | 2019-06-26 16:19:59 +0000 |
|---|---|---|
| committer | Thomas Lively <tlively@google.com> | 2019-06-26 16:19:59 +0000 |
| commit | 7663e0cd7dbb2d8c4dd1f445f7818ac4ebc02c99 (patch) | |
| tree | 6ce594b3343b4ab0eade134443d4b11ca368b338 /llvm/test/CodeGen/WebAssembly | |
| parent | a1d97a960e622ee21550d92809512cb0870be499 (diff) | |
| download | bcm5719-llvm-7663e0cd7dbb2d8c4dd1f445f7818ac4ebc02c99.tar.gz bcm5719-llvm-7663e0cd7dbb2d8c4dd1f445f7818ac4ebc02c99.zip | |
[WebAssembly] Omit wrap on i64x2.{shl,shr*} ISel when possible
Summary:
Since the WebAssembly SIMD shift instructions take i32 operands, we
truncate the i64 operand to <2 x i64> shifts during ISel. When the i64
operand is sign extended from i32, this CL makes it so the sign
extension is dropped instead of a wrap instruction added.
Reviewers: dschuff, aheejin
Subscribers: sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D63615
llvm-svn: 364446
Diffstat (limited to 'llvm/test/CodeGen/WebAssembly')
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/simd-arith.ll | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/llvm/test/CodeGen/WebAssembly/simd-arith.ll b/llvm/test/CodeGen/WebAssembly/simd-arith.ll index 8d7f0205415..bd5479a0f35 100644 --- a/llvm/test/CodeGen/WebAssembly/simd-arith.ll +++ b/llvm/test/CodeGen/WebAssembly/simd-arith.ll @@ -730,13 +730,26 @@ define <2 x i64> @shl_v2i64(<2 x i64> %v, i32 %x) { ret <2 x i64> %a } -; CHECK-LABEL: shl_nozext_v2i64: +; CHECK-LABEL: shl_sext_v2i64: ; NO-SIMD128-NOT: i64x2 -; SIMD128-NEXT: .functype shl_nozext_v2i64 (v128, i64) -> (v128){{$}} +; SIMD128-NEXT: .functype shl_sext_v2i64 (v128, i32) -> (v128){{$}} +; SIMD128-NEXT: i64x2.shl $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <2 x i64> @shl_sext_v2i64(<2 x i64> %v, i32 %x) { + %x2 = sext i32 %x to i64 + %t = insertelement <2 x i64> undef, i64 %x2, i32 0 + %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> + %a = shl <2 x i64> %v, %s + ret <2 x i64> %a +} + +; CHECK-LABEL: shl_noext_v2i64: +; NO-SIMD128-NOT: i64x2 +; SIMD128-NEXT: .functype shl_noext_v2i64 (v128, i64) -> (v128){{$}} ; SIMD128-NEXT: i32.wrap_i64 $push[[L0:[0-9]+]]=, $1{{$}} ; SIMD128-NEXT: i64x2.shl $push[[R:[0-9]+]]=, $0, $pop[[L0]]{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} -define <2 x i64> @shl_nozext_v2i64(<2 x i64> %v, i64 %x) { +define <2 x i64> @shl_noext_v2i64(<2 x i64> %v, i64 %x) { %t = insertelement <2 x i64> undef, i64 %x, i32 0 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> %a = shl <2 x i64> %v, %s @@ -784,13 +797,26 @@ define <2 x i64> @shr_s_v2i64(<2 x i64> %v, i32 %x) { ret <2 x i64> %a } -; CHECK-LABEL: shr_s_nozext_v2i64: +; CHECK-LABEL: shr_s_sext_v2i64: ; NO-SIMD128-NOT: i64x2 -; SIMD128-NEXT: .functype shr_s_nozext_v2i64 (v128, i64) -> (v128){{$}} +; SIMD128-NEXT: .functype shr_s_sext_v2i64 (v128, i32) -> (v128){{$}} +; SIMD128-NEXT: i64x2.shr_s $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <2 x i64> @shr_s_sext_v2i64(<2 x i64> %v, i32 %x) { + %x2 = sext i32 %x to i64 + %t = insertelement <2 x i64> undef, i64 %x2, i32 0 + %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> + %a = ashr <2 x i64> %v, %s + ret <2 x i64> %a +} + +; CHECK-LABEL: shr_s_noext_v2i64: +; NO-SIMD128-NOT: i64x2 +; SIMD128-NEXT: .functype shr_s_noext_v2i64 (v128, i64) -> (v128){{$}} ; SIMD128-NEXT: i32.wrap_i64 $push[[L0:[0-9]+]]=, $1{{$}} ; SIMD128-NEXT: i64x2.shr_s $push[[R:[0-9]+]]=, $0, $pop[[L0]]{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} -define <2 x i64> @shr_s_nozext_v2i64(<2 x i64> %v, i64 %x) { +define <2 x i64> @shr_s_noext_v2i64(<2 x i64> %v, i64 %x) { %t = insertelement <2 x i64> undef, i64 %x, i32 0 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> %a = ashr <2 x i64> %v, %s @@ -838,13 +864,26 @@ define <2 x i64> @shr_u_v2i64(<2 x i64> %v, i32 %x) { ret <2 x i64> %a } -; CHECK-LABEL: shr_u_nozext_v2i64: +; CHECK-LABEL: shr_u_sext_v2i64: +; NO-SIMD128-NOT: i64x2 +; SIMD128-NEXT: .functype shr_u_sext_v2i64 (v128, i32) -> (v128){{$}} +; SIMD128-NEXT: i64x2.shr_u $push[[R:[0-9]+]]=, $0, $1{{$}} +; SIMD128-NEXT: return $pop[[R]]{{$}} +define <2 x i64> @shr_u_sext_v2i64(<2 x i64> %v, i32 %x) { + %x2 = sext i32 %x to i64 + %t = insertelement <2 x i64> undef, i64 %x2, i32 0 + %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> + %a = lshr <2 x i64> %v, %s + ret <2 x i64> %a +} + +; CHECK-LABEL: shr_u_noext_v2i64: ; NO-SIMD128-NOT: i64x2 -; SIMD128-NEXT: .functype shr_u_nozext_v2i64 (v128, i64) -> (v128){{$}} +; SIMD128-NEXT: .functype shr_u_noext_v2i64 (v128, i64) -> (v128){{$}} ; SIMD128-NEXT: i32.wrap_i64 $push[[L0:[0-9]+]]=, $1{{$}} ; SIMD128-NEXT: i64x2.shr_u $push[[R:[0-9]+]]=, $0, $pop[[L0]]{{$}} ; SIMD128-NEXT: return $pop[[R]]{{$}} -define <2 x i64> @shr_u_nozext_v2i64(<2 x i64> %v, i64 %x) { +define <2 x i64> @shr_u_noext_v2i64(<2 x i64> %v, i64 %x) { %t = insertelement <2 x i64> undef, i64 %x, i32 0 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> %a = lshr <2 x i64> %v, %s |

