@@ -282,6 +282,7 @@ define i32 @ashr_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
282282; CHECK-NEXT: orb $1, %cl
283283; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
284284; CHECK-NEXT: sarl %cl, %edi
285+ ; CHECK-NEXT: testl %edi, %edi
285286; CHECK-NEXT: cmovel %edx, %eax
286287; CHECK-NEXT: retq
287288 %a = or i32 %a1 , 1
@@ -300,6 +301,7 @@ define i32 @lshr_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
300301; CHECK-NEXT: orb $1, %cl
301302; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
302303; CHECK-NEXT: shrl %cl, %edi
304+ ; CHECK-NEXT: testl %edi, %edi
303305; CHECK-NEXT: cmovel %edx, %eax
304306; CHECK-NEXT: retq
305307 %a = or i32 %a1 , 1
@@ -318,6 +320,7 @@ define i32 @shl_var_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a3) {
318320; CHECK-NEXT: orb $1, %cl
319321; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
320322; CHECK-NEXT: shll %cl, %edi
323+ ; CHECK-NEXT: testl %edi, %edi
321324; CHECK-NEXT: cmovel %edx, %eax
322325; CHECK-NEXT: retq
323326 %a = or i32 %a1 , 1
@@ -336,6 +339,7 @@ define i32 @ashr_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %
336339; CHECK-NEXT: orb $1, %cl
337340; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
338341; CHECK-NEXT: shrl %cl, %eax
342+ ; CHECK-NEXT: testl %eax, %eax
339343; CHECK-NEXT: cmovnel %edx, %eax
340344; CHECK-NEXT: retq
341345 %a = or i32 %a1 , 1
@@ -354,6 +358,7 @@ define i32 @lshr_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %
354358; CHECK-NEXT: orb $1, %cl
355359; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
356360; CHECK-NEXT: shrl %cl, %eax
361+ ; CHECK-NEXT: testl %eax, %eax
357362; CHECK-NEXT: cmovnel %edx, %eax
358363; CHECK-NEXT: retq
359364 %a = or i32 %a1 , 1
@@ -372,6 +377,7 @@ define i32 @shl_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a
372377; CHECK-NEXT: orb $1, %cl
373378; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
374379; CHECK-NEXT: shrl %cl, %eax
380+ ; CHECK-NEXT: testl %eax, %eax
375381; CHECK-NEXT: cmovnel %edx, %eax
376382; CHECK-NEXT: retq
377383 %a = or i32 %a1 , 1
@@ -381,19 +387,89 @@ define i32 @shl_var_self_select_amt_never_zero(i32 %a0, i32 %a1, i32 %a2, i32 %a
381387 ret i32 %r
382388}
383389
384- define range( i8 0 , 2 ) i8 @no_test_emitted_when_assume_shift_amt_gt_zero ( i64 noundef %0 , i32 noundef %1 ) {
385- ; CHECK-LABEL: no_test_emitted_when_assume_shift_amt_gt_zero :
390+ define i1 @shl_optsize_nonzero_removes_test ( i32 %val , i32 %amt ) optsize {
391+ ; CHECK-LABEL: shl_optsize_nonzero_removes_test :
386392; CHECK: # %bb.0:
387393; CHECK-NEXT: movl %esi, %ecx
394+ ; CHECK-NEXT: orb $1, %cl
388395; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
389- ; CHECK-NEXT: shlq %cl, %rdi
396+ ; CHECK-NEXT: shll %cl, %edi
397+ ; CHECK-NEXT: sete %al
398+ ; CHECK-NEXT: retq
399+ %amt.nz = or i32 %amt , 1
400+ %shl = shl i32 %val , %amt.nz
401+ %cmp = icmp eq i32 %shl , 0
402+ ret i1 %cmp
403+ }
404+
405+ define i1 @shl_optsize_maybezero_keeps_test (i32 %val , i32 %amt ) optsize {
406+ ; CHECK-LABEL: shl_optsize_maybezero_keeps_test:
407+ ; CHECK: # %bb.0:
408+ ; CHECK-NEXT: movl %esi, %ecx
409+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
410+ ; CHECK-NEXT: shll %cl, %edi
411+ ; CHECK-NEXT: testl %edi, %edi
412+ ; CHECK-NEXT: sete %al
413+ ; CHECK-NEXT: retq
414+ %shl = shl i32 %val , %amt
415+ %cmp = icmp eq i32 %shl , 0
416+ ret i1 %cmp
417+ }
418+
419+ define i1 @lshr_optsize_nonezero_removes_test (i32 %val , i32 %amt ) optsize {
420+ ; CHECK-LABEL: lshr_optsize_nonezero_removes_test:
421+ ; CHECK: # %bb.0:
422+ ; CHECK-NEXT: movl %esi, %ecx
423+ ; CHECK-NEXT: orb $1, %cl
424+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
425+ ; CHECK-NEXT: shrl %cl, %edi
426+ ; CHECK-NEXT: sete %al
427+ ; CHECK-NEXT: retq
428+ %amt.nz = or i32 %amt , 1
429+ %shr = lshr i32 %val , %amt.nz
430+ %cmp = icmp eq i32 %shr , 0
431+ ret i1 %cmp
432+ }
433+
434+ define i1 @lshr_optsize_maybezero_keeps_test (i32 %val , i32 %amt ) optsize {
435+ ; CHECK-LABEL: lshr_optsize_maybezero_keeps_test:
436+ ; CHECK: # %bb.0:
437+ ; CHECK-NEXT: movl %esi, %ecx
438+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
439+ ; CHECK-NEXT: shrl %cl, %edi
440+ ; CHECK-NEXT: testl %edi, %edi
441+ ; CHECK-NEXT: sete %al
442+ ; CHECK-NEXT: retq
443+ %shr = lshr i32 %val , %amt
444+ %cmp = icmp eq i32 %shr , 0
445+ ret i1 %cmp
446+ }
447+
448+ define i1 @ashr_optsize_nonezero_removes_test (i32 %val , i32 %amt ) optsize {
449+ ; CHECK-LABEL: ashr_optsize_nonezero_removes_test:
450+ ; CHECK: # %bb.0:
451+ ; CHECK-NEXT: movl %esi, %ecx
452+ ; CHECK-NEXT: orb $1, %cl
453+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
454+ ; CHECK-NEXT: sarl %cl, %edi
455+ ; CHECK-NEXT: sete %al
456+ ; CHECK-NEXT: retq
457+ %amt.nz = or i32 %amt , 1
458+ %sar = ashr i32 %val , %amt.nz
459+ %cmp = icmp eq i32 %sar , 0
460+ ret i1 %cmp
461+ }
462+
463+ define i1 @ashr_optsize_maybezero_keeps_test (i32 %val , i32 %amt ) optsize {
464+ ; CHECK-LABEL: ashr_optsize_maybezero_keeps_test:
465+ ; CHECK: # %bb.0:
466+ ; CHECK-NEXT: movl %esi, %ecx
467+ ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
468+ ; CHECK-NEXT: sarl %cl, %edi
469+ ; CHECK-NEXT: testl %edi, %edi
390470; CHECK-NEXT: sete %al
391471; CHECK-NEXT: retq
392- %3 = icmp sgt i32 %1 , 0
393- tail call void @llvm.assume (i1 %3 )
394- %4 = zext nneg i32 %1 to i64
395- %5 = shl i64 %0 , %4
396- %6 = icmp eq i64 %5 , 0
397- %7 = zext i1 %6 to i8
398- ret i8 %7
472+ %sar = ashr i32 %val , %amt
473+ %cmp = icmp eq i32 %sar , 0
474+ ret i1 %cmp
399475}
0 commit comments