@@ -252,3 +252,64 @@ define i32 @multi_use_select(i32 %a, i32 %b) {
252252}
253253
254254
255+ define i8 @no_fold_usub_extra_use (i8 %a , i8 %b ) {
256+ ; CHECK-LABEL: define i8 @no_fold_usub_extra_use(
257+ ; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
258+ ; CHECK-NEXT: [[A_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A]], i8 -33)
259+ ; CHECK-NEXT: [[B_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[B]], i8 -17)
260+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[A_SUB]], [[B_SUB]]
261+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
262+ ; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 0, i8 -128
263+ ; CHECK-NEXT: call void @use(i8 [[A_SUB]])
264+ ; CHECK-NEXT: ret i8 [[RES]]
265+ ;
266+ %a_sub = call i8 @llvm.usub.sat.i8 (i8 %a , i8 223 )
267+ %b_sub = call i8 @llvm.usub.sat.i8 (i8 %b , i8 239 )
268+ %or = or i8 %a_sub , %b_sub
269+ %cmp = icmp eq i8 %or , 0
270+ %res = select i1 %cmp , i8 0 , i8 128
271+ call void @use (i8 %a_sub )
272+ ret i8 %res
273+ }
274+
275+ define i8 @no_fold_or_extra_use (i8 %a , i8 %b ) {
276+ ; CHECK-LABEL: define i8 @no_fold_or_extra_use(
277+ ; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
278+ ; CHECK-NEXT: [[A_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A]], i8 -33)
279+ ; CHECK-NEXT: [[B_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[B]], i8 -17)
280+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[A_SUB]], [[B_SUB]]
281+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
282+ ; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 0, i8 -128
283+ ; CHECK-NEXT: call void @use(i8 [[OR]])
284+ ; CHECK-NEXT: ret i8 [[RES]]
285+ ;
286+ %a_sub = call i8 @llvm.usub.sat.i8 (i8 %a , i8 223 )
287+ %b_sub = call i8 @llvm.usub.sat.i8 (i8 %b , i8 239 )
288+ %or = or i8 %a_sub , %b_sub
289+ %cmp = icmp eq i8 %or , 0
290+ %res = select i1 %cmp , i8 0 , i8 128
291+ call void @use (i8 %or )
292+ ret i8 %res
293+ }
294+
295+ define i8 @no_fold_usub_b_extra_use (i8 %a , i8 %b ) {
296+ ; CHECK-LABEL: define i8 @no_fold_usub_b_extra_use(
297+ ; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
298+ ; CHECK-NEXT: [[A_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A]], i8 -33)
299+ ; CHECK-NEXT: [[B_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[B]], i8 -17)
300+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[A_SUB]], [[B_SUB]]
301+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
302+ ; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 0, i8 -128
303+ ; CHECK-NEXT: call void @use(i8 [[B_SUB]])
304+ ; CHECK-NEXT: ret i8 [[RES]]
305+ ;
306+ %a_sub = call i8 @llvm.usub.sat.i8 (i8 %a , i8 223 )
307+ %b_sub = call i8 @llvm.usub.sat.i8 (i8 %b , i8 239 )
308+ %or = or i8 %a_sub , %b_sub
309+ %cmp = icmp eq i8 %or , 0
310+ %res = select i1 %cmp , i8 0 , i8 128
311+ call void @use (i8 %b_sub )
312+ ret i8 %res
313+ }
314+
315+ declare void @use (i8 )
0 commit comments