diff options
| author | Thomas Lively <tlively@google.com> | 2019-06-19 00:02:13 +0000 | 
|---|---|---|
| committer | Thomas Lively <tlively@google.com> | 2019-06-19 00:02:13 +0000 | 
| commit | 1885747498c2730e47fee42a0c59492d09f4352f (patch) | |
| tree | fc67f58fb72ddf7bee539f723c447def4994231e /llvm/lib/Target/WebAssembly | |
| parent | c6b5be6cf07858c9a76fbfea3f5a8d9bda1577a2 (diff) | |
| download | bcm5719-llvm-1885747498c2730e47fee42a0c59492d09f4352f.tar.gz bcm5719-llvm-1885747498c2730e47fee42a0c59492d09f4352f.zip | |
[WebAssembly] Optimize ISel for SIMD Boolean reductions
Summary:
Converting the result *.{all,any}_true to a bool at the source level
generates LLVM IR that compares the result to 0. This check is
redundant since these instructions already return either 0 or 1 and
therefore conform to the BooleanContents setting for WebAssembly. This
CL adds patterns to detect and remove such redundant operations on the
result of Boolean reductions.
Reviewers: dschuff, aheejin
Subscribers: sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D63529
llvm-svn: 363756
Diffstat (limited to 'llvm/lib/Target/WebAssembly')
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td | 22 | 
1 files changed, 22 insertions, 0 deletions
| diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td index 59b56cac5de..cae02d20bd3 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td @@ -527,6 +527,28 @@ defm ANYTRUE : SIMDReduce<int_wasm_anytrue, "any_true", 82>;  // All lanes true: all_true  defm ALLTRUE : SIMDReduce<int_wasm_alltrue, "all_true", 83>; +// Reductions already return 0 or 1, so and 1, setne 0, and seteq 1 +// can be folded out +foreach reduction = +  [["int_wasm_anytrue", "ANYTRUE"], ["int_wasm_alltrue", "ALLTRUE"]] in +foreach ty = [v16i8, v8i16, v4i32, v2i64] in { +def : Pat<(i32 (and +            (i32 (!cast<Intrinsic>(reduction[0]) (ty V128:$x))), +            (i32 1) +          )), +          (i32 (!cast<NI>(reduction[1]#"_"#ty) (ty V128:$x)))>; +def : Pat<(i32 (setne +            (i32 (!cast<Intrinsic>(reduction[0]) (ty V128:$x))), +            (i32 0) +          )), +          (i32 (!cast<NI>(reduction[1]#"_"#ty) (ty V128:$x)))>; +def : Pat<(i32 (seteq +            (i32 (!cast<Intrinsic>(reduction[0]) (ty V128:$x))), +            (i32 1) +          )), +          (i32 (!cast<NI>(reduction[1]#"_"#ty) (ty V128:$x)))>; +} +  //===----------------------------------------------------------------------===//  // Bit shifts  //===----------------------------------------------------------------------===// | 

