1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 -disable-output %s 2>&1 | FileCheck %s 3 4; %i and %i + 1 can overflow. 5define void @test1(i64 %x, ptr %a, ptr %b) { 6; CHECK-LABEL: 'test1' 7; CHECK-NEXT: Determining loop execution counts for: @test1 8; CHECK-NEXT: Loop %header: <multiple exits> Unpredictable backedge-taken count. 9; CHECK-NEXT: exit count for header: ***COULDNOTCOMPUTE*** 10; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 11; CHECK-NEXT: predicated exit count for latch: (-1 + (1 umax %x)) 12; CHECK-NEXT: Predicates: 13; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 14; CHECK-EMPTY: 15; CHECK-NEXT: Loop %header: Unpredictable constant max backedge-taken count. 16; CHECK-NEXT: Loop %header: Unpredictable symbolic max backedge-taken count. 17; CHECK-NEXT: symbolic max exit count for header: ***COULDNOTCOMPUTE*** 18; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 19; CHECK-NEXT: predicated symbolic max exit count for latch: (-1 + (1 umax %x)) 20; CHECK-NEXT: Predicates: 21; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 22; CHECK-EMPTY: 23; CHECK-NEXT: Loop %header: Predicated constant max backedge-taken count is i64 -2 24; CHECK-NEXT: Predicates: 25; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 26; CHECK-NEXT: Loop %header: Predicated symbolic max backedge-taken count is (-1 + (1 umax %x)) 27; CHECK-NEXT: Predicates: 28; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 29; 30entry: 31 br label %header 32 33header: 34 %conv11 = phi i64 [ 0, %entry ], [ %conv, %latch ] 35 %i.010 = phi i32 [ 0, %entry ], [ %add, %latch ] 36 %add = add i32 %i.010, 1 37 %idxprom = zext i32 %add to i64 38 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %idxprom 39 %ld = load i32, ptr %arrayidx, align 4 40 %uncountable.c = icmp eq i32 %ld, 10 41 br i1 %uncountable.c, label %exit, label %latch 42 43latch: 44 %add2 = add nsw i32 %ld, 1 45 %arrayidx4 = getelementptr inbounds i32, ptr %b, i64 %conv11 46 store i32 %add2, ptr %arrayidx4, align 4 47 %conv = zext i32 %add to i64 48 %cmp = icmp ult i64 %conv, %x 49 br i1 %cmp, label %header, label %exit 50 51exit: 52 ret void 53} 54 55; %i can overflow. 56; 57; We need to check that i doesn't wrap, but we don't need a run-time alias 58; check. We also need an extra no-wrap check to get the backedge taken count. 59define void @test2(i64 %x, ptr %a) { 60; CHECK-LABEL: 'test2' 61; CHECK-NEXT: Determining loop execution counts for: @test2 62; CHECK-NEXT: Loop %header: <multiple exits> Unpredictable backedge-taken count. 63; CHECK-NEXT: exit count for header: ***COULDNOTCOMPUTE*** 64; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 65; CHECK-NEXT: predicated exit count for latch: (-1 + (1 umax %x)) 66; CHECK-NEXT: Predicates: 67; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 68; CHECK-EMPTY: 69; CHECK-NEXT: Loop %header: Unpredictable constant max backedge-taken count. 70; CHECK-NEXT: Loop %header: Unpredictable symbolic max backedge-taken count. 71; CHECK-NEXT: symbolic max exit count for header: ***COULDNOTCOMPUTE*** 72; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 73; CHECK-NEXT: predicated symbolic max exit count for latch: (-1 + (1 umax %x)) 74; CHECK-NEXT: Predicates: 75; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 76; CHECK-EMPTY: 77; CHECK-NEXT: Loop %header: Predicated constant max backedge-taken count is i64 -2 78; CHECK-NEXT: Predicates: 79; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 80; CHECK-NEXT: Loop %header: Predicated symbolic max backedge-taken count is (-1 + (1 umax %x)) 81; CHECK-NEXT: Predicates: 82; CHECK-NEXT: {1,+,1}<%header> Added Flags: <nusw> 83; 84entry: 85 br label %header 86 87header: 88 %conv11 = phi i64 [ 0, %entry ], [ %conv, %latch ] 89 %i.010 = phi i32 [ 0, %entry ], [ %inc, %latch ] 90 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %conv11 91 %ld = load i32, ptr %arrayidx, align 4 92 %uncountable.c = icmp eq i32 %ld, 10 93 br i1 %uncountable.c, label %exit, label %latch 94 95latch: 96 %add = add nsw i32 %ld, 1 97 store i32 %add, ptr %arrayidx, align 4 98 %inc = add i32 %i.010, 1 99 %conv = zext i32 %inc to i64 100 %cmp = icmp ult i64 %conv, %x 101 br i1 %cmp, label %header, label %exit 102 103exit: 104 ret void 105} 106