@@ -411,3 +411,56 @@ header:
411411exit:
412412 ret void
413413}
414+
415+ define void @swapped_predicate (i32 %n ) nounwind {
416+ ; Prove that (n >= 1) ===> (0 >= -n / 2).
417+ ; CHECK-LABEL: 'swapped_predicate'
418+ ; CHECK-NEXT: Determining loop execution counts for: @swapped_predicate
419+ ; CHECK-NEXT: Loop %header: backedge-taken count is (-1 * (0 smin (-1 + (-1 * %n.div.2)<nsw>)<nsw>))<nsw>
420+ ; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 1073741824
421+ ; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is (-1 * (0 smin (-1 + (-1 * %n.div.2)<nsw>)<nsw>))<nsw>
422+ ; CHECK-NEXT: Loop %header: Trip multiple is 1
423+ ;
424+ entry:
425+ %cmp1 = icmp sge i32 %n , 1
426+ %n.div.2 = sdiv i32 %n , 2
427+ call void (i1 , ...) @llvm.experimental.guard (i1 %cmp1 ) [ "deopt" () ]
428+ br label %header
429+
430+ header:
431+ %indvar = phi i32 [ %indvar.next , %header ], [ 0 , %entry ]
432+ %indvar.next = add i32 %indvar , 1
433+ %minus.indvar = sub nsw i32 0 , %indvar
434+ %minus.n.div.2 = sub nsw i32 0 , %n.div.2
435+ %exitcond = icmp sge i32 %minus.indvar , %minus.n.div.2
436+ br i1 %exitcond , label %header , label %exit
437+
438+ exit:
439+ ret void
440+ }
441+
442+ define void @swapped_predicate_neg (i32 %n ) nounwind {
443+ ; Prove that (n >= 1) =\=> (-n / 2 >= 0).
444+ ; CHECK-LABEL: 'swapped_predicate_neg'
445+ ; CHECK-NEXT: Determining loop execution counts for: @swapped_predicate_neg
446+ ; CHECK-NEXT: Loop %header: Unpredictable backedge-taken count.
447+ ; CHECK-NEXT: Loop %header: Unpredictable constant max backedge-taken count.
448+ ; CHECK-NEXT: Loop %header: Unpredictable symbolic max backedge-taken count.
449+ ;
450+ entry:
451+ %cmp1 = icmp sge i32 %n , 1
452+ %n.div.2 = sdiv i32 %n , 2
453+ call void (i1 , ...) @llvm.experimental.guard (i1 %cmp1 ) [ "deopt" () ]
454+ br label %header
455+
456+ header:
457+ %indvar = phi i32 [ %indvar.next , %header ], [ 0 , %entry ]
458+ %indvar.next = add i32 %indvar , 1
459+ %minus.indvar = sub nsw i32 0 , %indvar
460+ %minus.n.div.2 = sub nsw i32 0 , %n.div.2
461+ %exitcond = icmp sge i32 %minus.n.div.2 , %minus.indvar
462+ br i1 %exitcond , label %header , label %exit
463+
464+ exit:
465+ ret void
466+ }
0 commit comments