Skip to content

Commit 2dad797

Browse files
committed
[RISCV] Add test cases for conditional add/sub. NFC
InstCombine canonicalizes c ? (x+y) : x to (c ? y : 0) + x. It does the same for and/or/xor. We already reverse this transform for those, but don't do add/sub yet.
1 parent 14f4430 commit 2dad797

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

llvm/test/CodeGen/RISCV/select-binop-identity.ll

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,108 @@ define i64 @xor_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) {
153153
%b = xor i64 %a, %y
154154
ret i64 %b
155155
}
156+
157+
define signext i32 @add_select_all_zeros_i32(i1 zeroext %c, i32 signext %x, i32 signext %y) {
158+
; RV32I-LABEL: add_select_all_zeros_i32:
159+
; RV32I: # %bb.0:
160+
; RV32I-NEXT: mv a3, zero
161+
; RV32I-NEXT: bnez a0, .LBB6_2
162+
; RV32I-NEXT: # %bb.1:
163+
; RV32I-NEXT: mv a3, a1
164+
; RV32I-NEXT: .LBB6_2:
165+
; RV32I-NEXT: add a0, a2, a3
166+
; RV32I-NEXT: ret
167+
;
168+
; RV64I-LABEL: add_select_all_zeros_i32:
169+
; RV64I: # %bb.0:
170+
; RV64I-NEXT: mv a3, zero
171+
; RV64I-NEXT: bnez a0, .LBB6_2
172+
; RV64I-NEXT: # %bb.1:
173+
; RV64I-NEXT: mv a3, a1
174+
; RV64I-NEXT: .LBB6_2:
175+
; RV64I-NEXT: addw a0, a2, a3
176+
; RV64I-NEXT: ret
177+
%a = select i1 %c, i32 0, i32 %x
178+
%b = add i32 %y, %a
179+
ret i32 %b
180+
}
181+
182+
define i64 @add_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) {
183+
; RV32I-LABEL: add_select_all_zeros_i64:
184+
; RV32I: # %bb.0:
185+
; RV32I-NEXT: bnez a0, .LBB7_2
186+
; RV32I-NEXT: # %bb.1:
187+
; RV32I-NEXT: mv a2, zero
188+
; RV32I-NEXT: mv a1, zero
189+
; RV32I-NEXT: .LBB7_2:
190+
; RV32I-NEXT: add a0, a1, a3
191+
; RV32I-NEXT: sltu a1, a0, a1
192+
; RV32I-NEXT: add a2, a2, a4
193+
; RV32I-NEXT: add a1, a2, a1
194+
; RV32I-NEXT: ret
195+
;
196+
; RV64I-LABEL: add_select_all_zeros_i64:
197+
; RV64I: # %bb.0:
198+
; RV64I-NEXT: bnez a0, .LBB7_2
199+
; RV64I-NEXT: # %bb.1:
200+
; RV64I-NEXT: mv a1, zero
201+
; RV64I-NEXT: .LBB7_2:
202+
; RV64I-NEXT: add a0, a1, a2
203+
; RV64I-NEXT: ret
204+
%a = select i1 %c, i64 %x, i64 0
205+
%b = add i64 %a, %y
206+
ret i64 %b
207+
}
208+
209+
define signext i32 @sub_select_all_zeros_i32(i1 zeroext %c, i32 signext %x, i32 signext %y) {
210+
; RV32I-LABEL: sub_select_all_zeros_i32:
211+
; RV32I: # %bb.0:
212+
; RV32I-NEXT: mv a3, zero
213+
; RV32I-NEXT: bnez a0, .LBB8_2
214+
; RV32I-NEXT: # %bb.1:
215+
; RV32I-NEXT: mv a3, a1
216+
; RV32I-NEXT: .LBB8_2:
217+
; RV32I-NEXT: sub a0, a2, a3
218+
; RV32I-NEXT: ret
219+
;
220+
; RV64I-LABEL: sub_select_all_zeros_i32:
221+
; RV64I: # %bb.0:
222+
; RV64I-NEXT: mv a3, zero
223+
; RV64I-NEXT: bnez a0, .LBB8_2
224+
; RV64I-NEXT: # %bb.1:
225+
; RV64I-NEXT: mv a3, a1
226+
; RV64I-NEXT: .LBB8_2:
227+
; RV64I-NEXT: subw a0, a2, a3
228+
; RV64I-NEXT: ret
229+
%a = select i1 %c, i32 0, i32 %x
230+
%b = sub i32 %y, %a
231+
ret i32 %b
232+
}
233+
234+
define i64 @sub_select_all_zeros_i64(i1 zeroext %c, i64 %x, i64 %y) {
235+
; RV32I-LABEL: sub_select_all_zeros_i64:
236+
; RV32I: # %bb.0:
237+
; RV32I-NEXT: bnez a0, .LBB9_2
238+
; RV32I-NEXT: # %bb.1:
239+
; RV32I-NEXT: mv a2, zero
240+
; RV32I-NEXT: mv a1, zero
241+
; RV32I-NEXT: .LBB9_2:
242+
; RV32I-NEXT: sltu a0, a3, a1
243+
; RV32I-NEXT: sub a2, a4, a2
244+
; RV32I-NEXT: sub a2, a2, a0
245+
; RV32I-NEXT: sub a0, a3, a1
246+
; RV32I-NEXT: mv a1, a2
247+
; RV32I-NEXT: ret
248+
;
249+
; RV64I-LABEL: sub_select_all_zeros_i64:
250+
; RV64I: # %bb.0:
251+
; RV64I-NEXT: bnez a0, .LBB9_2
252+
; RV64I-NEXT: # %bb.1:
253+
; RV64I-NEXT: mv a1, zero
254+
; RV64I-NEXT: .LBB9_2:
255+
; RV64I-NEXT: sub a0, a2, a1
256+
; RV64I-NEXT: ret
257+
%a = select i1 %c, i64 %x, i64 0
258+
%b = sub i64 %y, %a
259+
ret i64 %b
260+
}

0 commit comments

Comments
 (0)