Skip to content

Commit 3dd319e

Browse files
committed
[LoongArch] Optimize conditional selection of integer
This patch optimizes code generation by leveraging the zeroing behavior of the `maskeqz`/`masknez` instructions. ``` int sel(int a, int b) { return (a < b) ? a : 0; } ``` ``` slt $a1,$a0,$a1 masknez $a2,$r0,$a1 maskeqz $a0,$a0,$a1 or $a0,$a0,$a2 ``` => ``` slt $a1,$a0,$a1 maskeqz $a0,$a0,$a1 ``` Reviewed By: SixWeining Differential Revision: https://reviews.llvm.org/D153193
1 parent 699adde commit 3dd319e

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,8 @@ def : Pat<(setle GPR:$rj, GPR:$rk), (XORI (SLT GPR:$rk, GPR:$rj), 1)>;
12011201

12021202
/// Select
12031203

1204+
def : Pat<(select GPR:$cond, GPR:$t, 0), (MASKEQZ GPR:$t, GPR:$cond)>;
1205+
def : Pat<(select GPR:$cond, 0, GPR:$f), (MASKNEZ GPR:$f, GPR:$cond)>;
12041206
def : Pat<(select GPR:$cond, GPR:$t, GPR:$f),
12051207
(OR (MASKEQZ GPR:$t, GPR:$cond), (MASKNEZ GPR:$f, GPR:$cond))>;
12061208

llvm/test/CodeGen/LoongArch/atomicrmw-uinc-udec-wrap.ll

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {
2222
; LA64-NEXT: addi.d $a5, $a5, 1
2323
; LA64-NEXT: xori $a6, $a6, 1
2424
; LA64-NEXT: masknez $a5, $a5, $a6
25-
; LA64-NEXT: maskeqz $a6, $zero, $a6
26-
; LA64-NEXT: or $a5, $a6, $a5
2725
; LA64-NEXT: andi $a5, $a5, 255
2826
; LA64-NEXT: sll.w $a5, $a5, $a0
2927
; LA64-NEXT: and $a6, $a3, $a4
@@ -77,8 +75,6 @@ define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {
7775
; LA64-NEXT: addi.d $a5, $a5, 1
7876
; LA64-NEXT: xori $a6, $a6, 1
7977
; LA64-NEXT: masknez $a5, $a5, $a6
80-
; LA64-NEXT: maskeqz $a6, $zero, $a6
81-
; LA64-NEXT: or $a5, $a6, $a5
8278
; LA64-NEXT: bstrpick.d $a5, $a5, 15, 0
8379
; LA64-NEXT: sll.w $a5, $a5, $a0
8480
; LA64-NEXT: and $a6, $a3, $a4
@@ -123,8 +119,6 @@ define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {
123119
; LA64-NEXT: xori $a1, $a1, 1
124120
; LA64-NEXT: addi.d $a4, $a3, 1
125121
; LA64-NEXT: masknez $a4, $a4, $a1
126-
; LA64-NEXT: maskeqz $a1, $zero, $a1
127-
; LA64-NEXT: or $a4, $a1, $a4
128122
; LA64-NEXT: .LBB2_3: # %atomicrmw.start
129123
; LA64-NEXT: # Parent Loop BB2_1 Depth=1
130124
; LA64-NEXT: # => This Inner Loop Header: Depth=2
@@ -164,8 +158,6 @@ define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) {
164158
; LA64-NEXT: xori $a2, $a2, 1
165159
; LA64-NEXT: addi.d $a4, $a3, 1
166160
; LA64-NEXT: masknez $a4, $a4, $a2
167-
; LA64-NEXT: maskeqz $a2, $zero, $a2
168-
; LA64-NEXT: or $a4, $a2, $a4
169161
; LA64-NEXT: .LBB3_3: # %atomicrmw.start
170162
; LA64-NEXT: # Parent Loop BB3_1 Depth=1
171163
; LA64-NEXT: # => This Inner Loop Header: Depth=2

llvm/test/CodeGen/LoongArch/ir-instruction/select-bare-int.ll

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,35 @@ define i64 @bare_select_i64(i1 %a, i64 %b, i64 %c) {
106106
%res = select i1 %a, i64 %b, i64 %c
107107
ret i64 %res
108108
}
109+
110+
define i16 @bare_select_zero_i16(i1 %a, i16 %b) {
111+
; LA32-LABEL: bare_select_zero_i16:
112+
; LA32: # %bb.0:
113+
; LA32-NEXT: andi $a0, $a0, 1
114+
; LA32-NEXT: masknez $a0, $a1, $a0
115+
; LA32-NEXT: ret
116+
;
117+
; LA64-LABEL: bare_select_zero_i16:
118+
; LA64: # %bb.0:
119+
; LA64-NEXT: andi $a0, $a0, 1
120+
; LA64-NEXT: masknez $a0, $a1, $a0
121+
; LA64-NEXT: ret
122+
%res = select i1 %a, i16 0, i16 %b
123+
ret i16 %res
124+
}
125+
126+
define i32 @bare_select_zero_i32(i1 %a, i32 %b) {
127+
; LA32-LABEL: bare_select_zero_i32:
128+
; LA32: # %bb.0:
129+
; LA32-NEXT: andi $a0, $a0, 1
130+
; LA32-NEXT: maskeqz $a0, $a1, $a0
131+
; LA32-NEXT: ret
132+
;
133+
; LA64-LABEL: bare_select_zero_i32:
134+
; LA64: # %bb.0:
135+
; LA64-NEXT: andi $a0, $a0, 1
136+
; LA64-NEXT: maskeqz $a0, $a1, $a0
137+
; LA64-NEXT: ret
138+
%res = select i1 %a, i32 %b, i32 0
139+
ret i32 %res
140+
}

0 commit comments

Comments
 (0)