Skip to content

Commit eb15d00

Browse files
committedOct 29, 2018
[WebAssembly] Lower away condition truncations for scalar selects
Reviewers: aheejin, dschuff Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D53676 llvm-svn: 345521
1 parent 3a2f3c2 commit eb15d00

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed
 

‎llvm/lib/Target/WebAssembly/WebAssemblyInstrFloat.td

+7
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,10 @@ def : Pat<(select (i32 (seteq I32:$cond, 0)), F32:$lhs, F32:$rhs),
122122
(SELECT_F32 F32:$rhs, F32:$lhs, I32:$cond)>;
123123
def : Pat<(select (i32 (seteq I32:$cond, 0)), F64:$lhs, F64:$rhs),
124124
(SELECT_F64 F64:$rhs, F64:$lhs, I32:$cond)>;
125+
126+
// The legalizer inserts an unnecessary `and 1` to make input conform
127+
// to getBooleanContents, which we can lower away.
128+
def : Pat<(select (i32 (and I32:$cond, 1)), F32:$lhs, F32:$rhs),
129+
(SELECT_F32 F32:$lhs, F32:$rhs, I32:$cond)>;
130+
def : Pat<(select (i32 (and I32:$cond, 1)), F64:$lhs, F64:$rhs),
131+
(SELECT_F64 F64:$lhs, F64:$rhs, I32:$cond)>;

‎llvm/lib/Target/WebAssembly/WebAssemblyInstrInteger.td

+7
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,10 @@ def : Pat<(select (i32 (seteq I32:$cond, 0)), I32:$lhs, I32:$rhs),
122122
(SELECT_I32 I32:$rhs, I32:$lhs, I32:$cond)>;
123123
def : Pat<(select (i32 (seteq I32:$cond, 0)), I64:$lhs, I64:$rhs),
124124
(SELECT_I64 I64:$rhs, I64:$lhs, I32:$cond)>;
125+
126+
// The legalizer inserts an unnecessary `and 1` to make input conform
127+
// to getBooleanContents, which we can lower away.
128+
def : Pat<(select (i32 (and I32:$cond, 1)), I32:$lhs, I32:$rhs),
129+
(SELECT_I32 I32:$lhs, I32:$rhs, I32:$cond)>;
130+
def : Pat<(select (i32 (and I32:$cond, 1)), I64:$lhs, I64:$rhs),
131+
(SELECT_I64 I64:$lhs, I64:$rhs, I32:$cond)>;

‎llvm/test/CodeGen/WebAssembly/select.ll

+41-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
1+
; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s --check-prefixes CHECK,SLOW
22
; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -fast-isel -fast-isel-abort=1 | FileCheck %s
33

44
; Test that wasm select instruction is selected from LLVM select instruction.
@@ -16,6 +16,16 @@ define i32 @select_i32_bool(i1 zeroext %a, i32 %b, i32 %c) {
1616
ret i32 %cond
1717
}
1818

19+
; CHECK-LABEL: select_i32_bool_nozext:
20+
; CHECK-NEXT: .param i32, i32, i32{{$}}
21+
; CHECK-NEXT: .result i32{{$}}
22+
; SLOW-NEXT: i32.select $push0=, $1, $2, $0{{$}}
23+
; SLOW-NEXT: return $pop0{{$}}
24+
define i32 @select_i32_bool_nozext(i1 %a, i32 %b, i32 %c) {
25+
%cond = select i1 %a, i32 %b, i32 %c
26+
ret i32 %cond
27+
}
28+
1929
; CHECK-LABEL: select_i32_eq:
2030
; CHECK-NEXT: .param i32, i32, i32{{$}}
2131
; CHECK-NEXT: .result i32{{$}}
@@ -48,6 +58,16 @@ define i64 @select_i64_bool(i1 zeroext %a, i64 %b, i64 %c) {
4858
ret i64 %cond
4959
}
5060

61+
; CHECK-LABEL: select_i64_bool_nozext:
62+
; CHECK-NEXT: .param i32, i64, i64{{$}}
63+
; CHECK-NEXT: .result i64{{$}}
64+
; SLOW-NEXT: i64.select $push0=, $1, $2, $0{{$}}
65+
; SLOW-NEXT: return $pop0{{$}}
66+
define i64 @select_i64_bool_nozext(i1 %a, i64 %b, i64 %c) {
67+
%cond = select i1 %a, i64 %b, i64 %c
68+
ret i64 %cond
69+
}
70+
5171
; CHECK-LABEL: select_i64_eq:
5272
; CHECK-NEXT: .param i32, i64, i64{{$}}
5373
; CHECK-NEXT: .result i64{{$}}
@@ -80,6 +100,16 @@ define float @select_f32_bool(i1 zeroext %a, float %b, float %c) {
80100
ret float %cond
81101
}
82102

103+
; CHECK-LABEL: select_f32_bool_nozext:
104+
; CHECK-NEXT: .param i32, f32, f32{{$}}
105+
; CHECK-NEXT: .result f32{{$}}
106+
; SLOW-NEXT: f32.select $push0=, $1, $2, $0{{$}}
107+
; SLOW-NEXT: return $pop0{{$}}
108+
define float @select_f32_bool_nozext(i1 %a, float %b, float %c) {
109+
%cond = select i1 %a, float %b, float %c
110+
ret float %cond
111+
}
112+
83113
; CHECK-LABEL: select_f32_eq:
84114
; CHECK-NEXT: .param i32, f32, f32{{$}}
85115
; CHECK-NEXT: .result f32{{$}}
@@ -112,6 +142,16 @@ define double @select_f64_bool(i1 zeroext %a, double %b, double %c) {
112142
ret double %cond
113143
}
114144

145+
; CHECK-LABEL: select_f64_bool_nozext:
146+
; CHECK-NEXT: .param i32, f64, f64{{$}}
147+
; CHECK-NEXT: .result f64{{$}}
148+
; SLOW-NEXT: f64.select $push0=, $1, $2, $0{{$}}
149+
; SLOW-NEXT: return $pop0{{$}}
150+
define double @select_f64_bool_nozext(i1 %a, double %b, double %c) {
151+
%cond = select i1 %a, double %b, double %c
152+
ret double %cond
153+
}
154+
115155
; CHECK-LABEL: select_f64_eq:
116156
; CHECK-NEXT: .param i32, f64, f64{{$}}
117157
; CHECK-NEXT: .result f64{{$}}

0 commit comments

Comments
 (0)
Please sign in to comment.