blob: e041c963717626ea75202054c151c20036c5fa06 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -passes='print<scalar-evolution>' -disable-output 2>&1 | FileCheck %s
declare void @use(i64)
define void @test_step2_div4(i64 %n) {
; CHECK-LABEL: 'test_step2_div4'
; CHECK-NEXT: Classifying expressions for: @test_step2_div4
; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
; CHECK-NEXT: --> ({0,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
; CHECK-NEXT: --> {1,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
; CHECK-NEXT: --> ({0,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
; CHECK-NEXT: --> {2,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
; CHECK-NEXT: --> ({2,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
; CHECK-NEXT: --> {-1,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 4
; CHECK-NEXT: --> ({-2,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.next = add i64 %iv, 2
; CHECK-NEXT: --> {2,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: Determining loop execution counts for: @test_step2_div4
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
;
entry:
br label %loop
loop:
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
%div.0 = udiv i64 %iv, 4
call void @use(i64 %div.0)
%iv.1 = add i64 %iv, 1
%div.1 = udiv i64 %iv.1, 4
call void @use(i64 %div.1)
%iv.2 = add i64 %iv, 2
%div.2 = udiv i64 %iv.2, 4
call void @use(i64 %div.2)
%iv.neg.1 = add i64 %iv, -1
%div.neg.1 = udiv i64 %iv.neg.1, 4
call void @use(i64 %div.neg.1)
%iv.next = add i64 %iv, 2
%cond = icmp slt i64 %iv, %n
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @test_step3_div6(i64 %n) {
; CHECK-LABEL: 'test_step3_div6'
; CHECK-NEXT: Classifying expressions for: @test_step3_div6
; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.0 = udiv i64 %iv, 6
; CHECK-NEXT: --> ({0,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
; CHECK-NEXT: --> {1,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 6
; CHECK-NEXT: --> ({1,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
; CHECK-NEXT: --> {2,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 6
; CHECK-NEXT: --> ({2,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
; CHECK-NEXT: --> {-1,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 6
; CHECK-NEXT: --> ({-1,+,3}<%loop> /u 6) U: [0,3074457345618258603) S: [0,3074457345618258603) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.next = add i64 %iv, 3
; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: Determining loop execution counts for: @test_step3_div6
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
;
entry:
br label %loop
loop:
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
%div.0 = udiv i64 %iv, 6
call void @use(i64 %div.0)
%iv.1 = add i64 %iv, 1
%div.1 = udiv i64 %iv.1, 6
call void @use(i64 %div.1)
%iv.2 = add i64 %iv, 2
%div.2 = udiv i64 %iv.2, 6
call void @use(i64 %div.2)
%iv.neg.1 = add i64 %iv, -1
%div.neg.1 = udiv i64 %iv.neg.1, 6
call void @use(i64 %div.neg.1)
%iv.next = add i64 %iv, 3
%cond = icmp slt i64 %iv, %n
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @test_step4_div4(i64 %n) {
; CHECK-LABEL: 'test_step4_div4'
; CHECK-NEXT: Classifying expressions for: @test_step4_div4
; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
; CHECK-NEXT: --> {0,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
; CHECK-NEXT: --> ({0,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
; CHECK-NEXT: --> {1,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
; CHECK-NEXT: --> ({0,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
; CHECK-NEXT: --> {2,+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
; CHECK-NEXT: --> ({0,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.3 = add i64 %iv, 3
; CHECK-NEXT: --> {3,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.3 = udiv i64 %iv.3, 4
; CHECK-NEXT: --> ({0,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.4 = add i64 %iv, 4
; CHECK-NEXT: --> {4,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.4 = udiv i64 %iv.4, 4
; CHECK-NEXT: --> ({4,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.5 = add i64 %iv, 5
; CHECK-NEXT: --> {5,+,4}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %div.5 = udiv i64 %iv.5, 4
; CHECK-NEXT: --> ({4,+,4}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: %iv.next = add i64 %iv, 4
; CHECK-NEXT: --> {4,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
; CHECK-NEXT: Determining loop execution counts for: @test_step4_div4
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
;
entry:
br label %loop
loop:
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
%div.0 = udiv i64 %iv, 4
call void @use(i64 %div.0)
%iv.1 = add i64 %iv, 1
%div.1 = udiv i64 %iv.1, 4
call void @use(i64 %div.1)
%iv.2 = add i64 %iv, 2
%div.2 = udiv i64 %iv.2, 4
call void @use(i64 %div.2)
%iv.3 = add i64 %iv, 3
%div.3 = udiv i64 %iv.3, 4
call void @use(i64 %div.3)
%iv.4 = add i64 %iv, 4
%div.4 = udiv i64 %iv.4, 4
call void @use(i64 %div.4)
%iv.5 = add i64 %iv, 5
%div.5 = udiv i64 %iv.5, 4
call void @use(i64 %div.5)
%iv.next = add i64 %iv, 4
%cond = icmp slt i64 %iv, %n
br i1 %cond, label %loop, label %exit
exit:
ret void
}
define void @test_step2_start_outer_add_rec_step_16(i64 %n, i64 %m) {
; CHECK-LABEL: 'test_step2_start_outer_add_rec_step_16'
; CHECK-NEXT: Classifying expressions for: @test_step2_start_outer_add_rec_step_16
; CHECK-NEXT: %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
; CHECK-NEXT: --> {0,+,16}<%outer.header> U: [0,-15) S: [-9223372036854775808,9223372036854775793) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
; CHECK-NEXT: %iv = phi i64 [ %outer.iv, %outer.header ], [ %iv.next, %loop ]
; CHECK-NEXT: --> {{\{\{}}0,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
; CHECK-NEXT: --> ({{\{\{}}0,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
; CHECK-NEXT: --> {{\{\{}}1,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
; CHECK-NEXT: --> ({{\{\{}}0,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
; CHECK-NEXT: --> {{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
; CHECK-NEXT: --> ({{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.3 = add i64 %iv, 3
; CHECK-NEXT: --> {{\{\{}}3,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.3 = udiv i64 %iv.3, 4
; CHECK-NEXT: --> ({{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.4 = add i64 %iv, 4
; CHECK-NEXT: --> {{\{\{}}4,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.4 = udiv i64 %iv.4, 4
; CHECK-NEXT: --> ({{\{\{}}4,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.5 = add i64 %iv, 5
; CHECK-NEXT: --> {{\{\{}}5,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.5 = udiv i64 %iv.5, 4
; CHECK-NEXT: --> ({{\{\{}}4,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
; CHECK-NEXT: --> {{\{\{}}-1,+,16}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 4
; CHECK-NEXT: --> ({{\{\{}}-2,+,16}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.0 = udiv i64 %iv, 3
; CHECK-NEXT: --> ({{\{\{}}0,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.1 = udiv i64 %iv.1, 3
; CHECK-NEXT: --> ({{\{\{}}1,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.2 = udiv i64 %iv.2, 3
; CHECK-NEXT: --> ({{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.4 = udiv i64 %iv.4, 3
; CHECK-NEXT: --> ({{\{\{}}4,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.5 = udiv i64 %iv.5, 3
; CHECK-NEXT: --> ({{\{\{}}5,+,16}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.next = add i64 %iv, 2
; CHECK-NEXT: --> {{\{\{}}2,+,16}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %outer.iv.next = add i64 %outer.iv, 16
; CHECK-NEXT: --> {16,+,16}<%outer.header> U: [0,-15) S: [-9223372036854775808,9223372036854775793) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
; CHECK-NEXT: Determining loop execution counts for: @test_step2_start_outer_add_rec_step_16
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Predicated backedge-taken count is (%m /u 16)
; CHECK-NEXT: Predicates:
; CHECK-NEXT: Equal predicate: (zext i4 (trunc i64 %m to i4) to i64) == 0
; CHECK-NEXT: Loop %outer.header: Predicated constant max backedge-taken count is i64 1152921504606846975
; CHECK-NEXT: Predicates:
; CHECK-NEXT: Equal predicate: (zext i4 (trunc i64 %m to i4) to i64) == 0
; CHECK-NEXT: Loop %outer.header: Predicated symbolic max backedge-taken count is (%m /u 16)
; CHECK-NEXT: Predicates:
; CHECK-NEXT: Equal predicate: (zext i4 (trunc i64 %m to i4) to i64) == 0
;
entry:
br label %outer.header
outer.header:
%outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
br label %loop
loop:
%iv = phi i64 [ %outer.iv, %outer.header ], [ %iv.next, %loop ]
%div.0 = udiv i64 %iv, 4
call void @use(i64 %div.0)
%iv.1 = add i64 %iv, 1
%div.1 = udiv i64 %iv.1, 4
call void @use(i64 %div.1)
%iv.2 = add i64 %iv, 2
%div.2 = udiv i64 %iv.2, 4
call void @use(i64 %div.2)
%iv.3 = add i64 %iv, 3
%div.3 = udiv i64 %iv.3, 4
call void @use(i64 %div.3)
%iv.4 = add i64 %iv, 4
%div.4 = udiv i64 %iv.4, 4
call void @use(i64 %div.4)
%iv.5 = add i64 %iv, 5
%div.5 = udiv i64 %iv.5, 4
call void @use(i64 %div.5)
%iv.neg.1 = add i64 %iv, -1
%div.neg.1 = udiv i64 %iv.neg.1, 4
call void @use(i64 %div.neg.1)
%div3.0 = udiv i64 %iv, 3
call void @use(i64 %div3.0)
%div3.1 = udiv i64 %iv.1,3
call void @use(i64 %div3.1)
%div3.2 = udiv i64 %iv.2, 3
call void @use(i64 %div3.2)
%div3.4 = udiv i64 %iv.4, 3
call void @use(i64 %div3.4)
%div3.5 = udiv i64 %iv.5, 3
call void @use(i64 %div3.5)
%iv.next = add i64 %iv, 2
%cond = icmp slt i64 %iv, %n
br i1 %cond, label %loop, label %outer.latch
outer.latch:
%outer.iv.next = add i64 %outer.iv, 16
%outer.ec = icmp eq i64 %outer.iv, %m
br i1 %outer.ec, label %exit, label %outer.header
exit:
ret void
}
define void @test_step2_div4_start_outer_add_rec_step_2(i64 %n, i64 %m) {
; CHECK-LABEL: 'test_step2_div4_start_outer_add_rec_step_2'
; CHECK-NEXT: Classifying expressions for: @test_step2_div4_start_outer_add_rec_step_2
; CHECK-NEXT: %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
; CHECK-NEXT: --> {0,+,2}<%outer.header> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
; CHECK-NEXT: %iv = phi i64 [ %outer.iv, %outer.header ], [ %iv.next, %loop ]
; CHECK-NEXT: --> {{\{\{}}0,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.0 = udiv i64 %iv, 4
; CHECK-NEXT: --> ({{\{\{}}0,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.1 = add i64 %iv, 1
; CHECK-NEXT: --> {{\{\{}}1,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.1 = udiv i64 %iv.1, 4
; CHECK-NEXT: --> ({{\{\{}}0,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.2 = add i64 %iv, 2
; CHECK-NEXT: --> {{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.2 = udiv i64 %iv.2, 4
; CHECK-NEXT: --> ({{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.3 = add i64 %iv, 3
; CHECK-NEXT: --> {{\{\{}}3,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.3 = udiv i64 %iv.3, 4
; CHECK-NEXT: --> ({{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.4 = add i64 %iv, 4
; CHECK-NEXT: --> {{\{\{}}4,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.4 = udiv i64 %iv.4, 4
; CHECK-NEXT: --> ({{\{\{}}4,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.5 = add i64 %iv, 5
; CHECK-NEXT: --> {{\{\{}}5,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.5 = udiv i64 %iv.5, 4
; CHECK-NEXT: --> ({{\{\{}}4,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.neg.1 = add i64 %iv, -1
; CHECK-NEXT: --> {{\{\{}}-1,+,2}<%outer.header>,+,2}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div.neg.1 = udiv i64 %iv.neg.1, 4
; CHECK-NEXT: --> ({{\{\{}}-2,+,2}<%outer.header>,+,2}<%loop> /u 4) U: [0,4611686018427387904) S: [0,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.0 = udiv i64 %iv, 3
; CHECK-NEXT: --> ({{\{\{}}0,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.1 = udiv i64 %iv.1, 3
; CHECK-NEXT: --> ({{\{\{}}1,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.2 = udiv i64 %iv.2, 3
; CHECK-NEXT: --> ({{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.4 = udiv i64 %iv.4, 3
; CHECK-NEXT: --> ({{\{\{}}4,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517205) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %div3.5 = udiv i64 %iv.5, 3
; CHECK-NEXT: --> ({{\{\{}}5,+,2}<%outer.header>,+,2}<%loop> /u 3) U: [0,6148914691236517206) S: [0,6148914691236517206) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %iv.next = add i64 %iv, 2
; CHECK-NEXT: --> {{\{\{}}2,+,2}<%outer.header>,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable, %outer.header: Variant }
; CHECK-NEXT: %outer.iv.next = add i64 %outer.iv, 2
; CHECK-NEXT: --> {2,+,2}<%outer.header> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %outer.header: Computable, %loop: Invariant }
; CHECK-NEXT: Determining loop execution counts for: @test_step2_div4_start_outer_add_rec_step_2
; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Unpredictable backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Unpredictable constant max backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Unpredictable symbolic max backedge-taken count.
; CHECK-NEXT: Loop %outer.header: Predicated backedge-taken count is (%m /u 2)
; CHECK-NEXT: Predicates:
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %m to i1) to i64) == 0
; CHECK-NEXT: Loop %outer.header: Predicated constant max backedge-taken count is i64 9223372036854775807
; CHECK-NEXT: Predicates:
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %m to i1) to i64) == 0
; CHECK-NEXT: Loop %outer.header: Predicated symbolic max backedge-taken count is (%m /u 2)
; CHECK-NEXT: Predicates:
; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 %m to i1) to i64) == 0
;
entry:
br label %outer.header
outer.header:
%outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]
br label %loop
loop:
%iv = phi i64 [ %outer.iv, %outer.header ], [ %iv.next, %loop ]
%div.0 = udiv i64 %iv, 4
call void @use(i64 %div.0)
%iv.1 = add i64 %iv, 1
%div.1 = udiv i64 %iv.1, 4
call void @use(i64 %div.1)
%iv.2 = add i64 %iv, 2
%div.2 = udiv i64 %iv.2, 4
call void @use(i64 %div.2)
%iv.3 = add i64 %iv, 3
%div.3 = udiv i64 %iv.3, 4
call void @use(i64 %div.3)
%iv.4 = add i64 %iv, 4
%div.4 = udiv i64 %iv.4, 4
call void @use(i64 %div.4)
%iv.5 = add i64 %iv, 5
%div.5 = udiv i64 %iv.5, 4
call void @use(i64 %div.5)
%iv.neg.1 = add i64 %iv, -1
%div.neg.1 = udiv i64 %iv.neg.1, 4
call void @use(i64 %div.neg.1)
%div3.0 = udiv i64 %iv, 3
call void @use(i64 %div3.0)
%div3.1 = udiv i64 %iv.1,3
call void @use(i64 %div3.1)
%div3.2 = udiv i64 %iv.2, 3
call void @use(i64 %div3.2)
%div3.4 = udiv i64 %iv.4, 3
call void @use(i64 %div3.4)
%div3.5 = udiv i64 %iv.5, 3
call void @use(i64 %div3.5)
call void @use(i64 %div.neg.1)
%iv.next = add i64 %iv, 2
%cond = icmp slt i64 %iv, %n
br i1 %cond, label %loop, label %outer.latch
outer.latch:
%outer.iv.next = add i64 %outer.iv, 2
%outer.ec = icmp eq i64 %outer.iv, %m
br i1 %outer.ec, label %exit, label %outer.header
exit:
ret void
}