| ; 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 |
| } |